mirror of
https://github.com/github/codeql.git
synced 2026-04-22 15:25:18 +02:00
Merge branch 'main' into badalloc
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
.. _codeql-cli-2.20.7:
|
||||
|
||||
==========================
|
||||
CodeQL 2.20.7 (2025-03-18)
|
||||
==========================
|
||||
|
||||
.. 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 <https://github.blog/tag/code-scanning/>`__, `relevant GitHub Changelog updates <https://github.blog/changelog/label/code-scanning/>`__, `changes in the CodeQL extension for Visual Studio Code <https://marketplace.visualstudio.com/items/GitHub.vscode-codeql/changelog>`__, and the `CodeQL Action changelog <https://github.com/github/codeql-action/blob/main/CHANGELOG.md>`__.
|
||||
|
||||
Security Coverage
|
||||
-----------------
|
||||
|
||||
CodeQL 2.20.7 runs a total of 450 security queries when configured with the Default suite (covering 168 CWE). The Extended suite enables an additional 137 queries (covering 35 more CWE).
|
||||
|
||||
CodeQL CLI
|
||||
----------
|
||||
|
||||
There are no user-facing CLI changes in this release.
|
||||
@@ -0,0 +1,211 @@
|
||||
.. _codeql-cli-2.21.0:
|
||||
|
||||
==========================
|
||||
CodeQL 2.21.0 (2025-04-03)
|
||||
==========================
|
||||
|
||||
.. 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 <https://github.blog/tag/code-scanning/>`__, `relevant GitHub Changelog updates <https://github.blog/changelog/label/code-scanning/>`__, `changes in the CodeQL extension for Visual Studio Code <https://marketplace.visualstudio.com/items/GitHub.vscode-codeql/changelog>`__, and the `CodeQL Action changelog <https://github.com/github/codeql-action/blob/main/CHANGELOG.md>`__.
|
||||
|
||||
Security Coverage
|
||||
-----------------
|
||||
|
||||
CodeQL 2.21.0 runs a total of 452 security queries when configured with the Default suite (covering 168 CWE). The Extended suite enables an additional 136 queries (covering 35 more CWE). 1 security query has been added with this release.
|
||||
|
||||
CodeQL CLI
|
||||
----------
|
||||
|
||||
Miscellaneous
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
* On macOS the :code:`CODEQL_TRACER_RELOCATION_EXCLUDE` environment variable can now be used to exclude certain paths from the tracer relocation and tracing process. This environment variable accepts newline-separated regex patterns of binaries to be excluded.
|
||||
|
||||
Query Packs
|
||||
-----------
|
||||
|
||||
Bug Fixes
|
||||
~~~~~~~~~
|
||||
|
||||
JavaScript/TypeScript
|
||||
"""""""""""""""""""""
|
||||
|
||||
* Fixed a bug, first introduced in :code:`2.20.3`, that would prevent :code:`v-html` attributes in Vue files from being flagged by the :code:`js/xss` query. The original behaviour has been restored and the :code:`v-html` attribute is once again functioning as a sink for the :code:`js/xss` query.
|
||||
* Fixed a bug that would in rare cases cause some regexp-based checks to be seen as generic taint sanitisers, even though the underlying regexp is not restrictive enough. The regexps are now analysed more precisely,
|
||||
and unrestrictive regexp checks will no longer block taint flow.
|
||||
* Fixed a recently-introduced bug that caused :code:`js/server-side-unvalidated-url-redirection` to ignore valid hostname checks and report spurious alerts after such a check. The original behaviour has been restored.
|
||||
|
||||
Python
|
||||
""""""
|
||||
|
||||
* The :code:`py/unused-global-variable` now no longer flags variables that are only used in forward references (e.g. the :code:`Foo` in :code:`def bar(x: "Foo"): ...`).
|
||||
|
||||
GitHub Actions
|
||||
""""""""""""""
|
||||
|
||||
* Fixed typos in the query and alert titles for the queries
|
||||
:code:`actions/envpath-injection/critical`, :code:`actions/envpath-injection/medium`,
|
||||
:code:`actions/envvar-injection/critical`, and :code:`actions/envvar-injection/medium`.
|
||||
|
||||
Major Analysis Improvements
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Java/Kotlin
|
||||
"""""""""""
|
||||
|
||||
* Updated the :code:`java/unreleased-lock` query so that it no longer report alerts in cases where a boolean variable is used to track lock state.
|
||||
|
||||
Minor Analysis Improvements
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
C/C++
|
||||
"""""
|
||||
|
||||
* Fixed a bug in the models for Microsoft's Active Template Library (ATL).
|
||||
* The query "Use of basic integral type" (:code:`cpp/jpl-c/basic-int-types`) no longer produces alerts for the standard fixed width integer types (:code:`int8_t`, :code:`uint8_t`, etc.), and the :code:`_Bool` and :code:`bool` types.
|
||||
|
||||
C#
|
||||
""
|
||||
|
||||
* Improved dependency resolution in :code:`build-mode: none` extraction to handle failing :code:`dotnet restore` processes that managed to download a subset of the dependencies before the failure.
|
||||
* Increase query precision for :code:`cs/useless-gethashcode-call` by not flagging calls to :code:`GetHashCode` on :code:`uint`, :code:`long` and :code:`ulong`.
|
||||
* Increase query precision for :code:`cs/constant-condition` and allow the use of discards in switch/case statements and also take the condition (if any) into account.
|
||||
* The :code:`cs/local-not-disposed` query no longer flags un-disposed tasks as this is often not needed (explained `here <https://devblogs.microsoft.com/pfxteam/do-i-need-to-dispose-of-tasks/>`__).
|
||||
* Increase query precision for :code:`cs/useless-assignment-to-local` and :code:`cs/constant-condition` when *unknown* types are involved (mostly relevant for :code:`build-mode: none` databases).
|
||||
* Don't consider an if-statement to be *useless* in :code:`cs/useless-if-statement` if there is at least a comment.
|
||||
|
||||
Golang
|
||||
""""""
|
||||
|
||||
* False positives in "Log entries created from user input" (:code:`go/log-injection`) and "Clear-text logging of sensitive information" (:code:`go/clear-text-logging`) which involved the verb :code:`%T` in a format specifier have been fixed. As a result, some users may also see more alerts from the "Use of constant :code:`state` value in OAuth 2.0 URL" (:code:`go/constant-oauth2-state`) query.
|
||||
|
||||
Java/Kotlin
|
||||
"""""""""""
|
||||
|
||||
* Fixed a false positive in "Time-of-check time-of-use race condition" (:code:`java/toctou-race-condition`) where a field of a non-static class was not considered always-locked if it was accessed in a constructor.
|
||||
* Overrides of :code:`BroadcastReceiver::onReceive` with no statements in their body are no longer considered unverified by the :code:`java/improper-intent-verification` query. This will reduce false positives from :code:`onReceive` methods which do not perform any actions.
|
||||
|
||||
Python
|
||||
""""""
|
||||
|
||||
* The :code:`py/special-method-wrong-signature` has been modernized and rewritten to no longer rely on outdated APIs. Moreover, the query no longer flags cases where a default value is never used, as these alerts were rarely useful.
|
||||
|
||||
New Queries
|
||||
~~~~~~~~~~~
|
||||
|
||||
C#
|
||||
""
|
||||
|
||||
* Added a new query, :code:`csharp/path-combine`, to recommend against the :code:`Path.Combine` method due to it silently discarding its earlier parameters if later parameters are rooted.
|
||||
|
||||
Java/Kotlin
|
||||
"""""""""""
|
||||
|
||||
* Added a new quality query, :code:`java/empty-method`, to detect empty methods.
|
||||
* The query :code:`java/spring-boot-exposed-actuators` has been promoted from experimental to the main query pack. Its results will now appear by default, and the query itself will be removed from the `CodeQL Community Packs <https://github.com/GitHubSecurityLab/CodeQL-Community-Packs>`__. This query was originally submitted as an experimental query `by @ggolawski <https://github.com/github/codeql/pull/2901>`__.
|
||||
|
||||
Swift
|
||||
"""""
|
||||
|
||||
* Added a new summary query counting the total number of extracted AST nodes.
|
||||
|
||||
Language Libraries
|
||||
------------------
|
||||
|
||||
Bug Fixes
|
||||
~~~~~~~~~
|
||||
|
||||
Java/Kotlin
|
||||
"""""""""""
|
||||
|
||||
* In :code:`build-mode: none` where the project has a Gradle build system, database creation no longer attempts to download some non-existent jar files relating to non-jar Maven artifacts, such as BOMs. This was harmless, but saves some time and reduces spurious warnings.
|
||||
* Java extraction no longer freezes for a long time or times out when using libraries that feature expanding cyclic generic types. For example, this was known to occur when using some classes from the Blazebit Persistence library.
|
||||
* Java build-mode :code:`none` no longer fails when a required version of Gradle cannot be downloaded using the :code:`gradle wrapper` command, such as due to a firewall. It will now attempt to use the system version of Gradle if present, or otherwise proceed without detailed dependency information.
|
||||
* Java build-mode :code:`none` no longer fails when a required version of Maven cannot be downloaded, such as due to a firewall. It will now attempt to use the system version of Maven if present, or otherwise proceed without detailed dependency information.
|
||||
* Java build-mode :code:`none` now correctly uses Maven dependency information on Windows platforms.
|
||||
|
||||
Python
|
||||
""""""
|
||||
|
||||
* :code:`MatchLiteralPattern`\ s such as :code:`case None: ...` are now never pruned from the extracted source code. This fixes some situations where code was wrongly identified as unreachable.
|
||||
|
||||
GitHub Actions
|
||||
""""""""""""""
|
||||
|
||||
* The query :code:`actions/code-injection/medium` now produces alerts for injection vulnerabilities on :code:`pull_request` events.
|
||||
|
||||
Major Analysis Improvements
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
JavaScript/TypeScript
|
||||
"""""""""""""""""""""
|
||||
|
||||
* Added support for TypeScript 5.8.
|
||||
|
||||
Minor Analysis Improvements
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
C#
|
||||
""
|
||||
|
||||
* The models for :code:`System.Uri` have been modified to better model the flow of tainted URIs.
|
||||
* Modeled parameter passing between Blazor parent and child components.
|
||||
|
||||
Golang
|
||||
""""""
|
||||
|
||||
* We no longer track taint into a :code:`sync.Map` via the key of a key-value pair, since we do not model any way in which keys can be read from a :code:`sync.Map`.
|
||||
* :code:`database` source models have been added for v1 and v2 of the :code:`github.com/couchbase/gocb` package.
|
||||
* Added :code:`database` source models for the :code:`github.com/Masterminds/squirrel` ORM package.
|
||||
|
||||
Java/Kotlin
|
||||
"""""""""""
|
||||
|
||||
* Java extraction is now able to download Maven 3.9.x if a Maven Enforcer Plugin configuration indicates it is necessary. Maven 3.8.x is still preferred if the enforcer-plugin configuration (if any) permits it.
|
||||
* Added a path injection sanitizer for calls to :code:`java.lang.String.matches`, :code:`java.lang.String.replace`, and :code:`java.lang.String.replaceAll` that make sure '/', '\', '..' are not in the path.
|
||||
|
||||
JavaScript/TypeScript
|
||||
"""""""""""""""""""""
|
||||
|
||||
* Added support for additional :code:`fs-extra` methods as sinks in path-injection queries.
|
||||
* Added support for the newer version of :code:`Hapi` with the :code:`@hapi/hapi` import and :code:`server` function.
|
||||
* Improved modeling of the :code:`node:fs` module: :code:`await`\ -ed calls to :code:`read` and :code:`readFile` are now supported.
|
||||
* Added support for the :code:`@sap/hana-client`, :code:`@sap/hdbext` and :code:`hdb` packages.
|
||||
* Enhanced :code:`axios` support with new methods (:code:`postForm`, :code:`putForm`, :code:`patchForm`, :code:`getUri`, :code:`create`) and added support for :code:`interceptors.request` and :code:`interceptors.response`.
|
||||
* Improved support for :code:`got` package with :code:`Options`, :code:`paginate()` and :code:`extend()`
|
||||
* Added support for the :code:`ApolloServer` class from :code:`@apollo/server` and similar packages. In particular, the incoming data in a GraphQL resolver is now seen as a source of untrusted user input.
|
||||
* Improved support for :code:`superagent` to handle the case where the package is directly called as a function, or via the :code:`.del()` or :code:`.agent()` method.
|
||||
* Added support for the :code:`underscore.string` package.
|
||||
* Added additional flow step for :code:`unescape()` and :code:`escape()`.
|
||||
* Added support for the :code:`@tanstack/vue-query` package.
|
||||
* Added taint-steps for :code:`unescape()`.
|
||||
* Added support for the :code:`@tanstack/angular-query-experimental` package.
|
||||
* Improved support for the :code:`@angular/common/http` package, detecting outgoing HTTP requests in more cases.
|
||||
* Improved the modeling of the :code:`markdown-table` package to ensure it handles nested arrays properly.
|
||||
* Added support for the :code:`react-relay` library.
|
||||
|
||||
Python
|
||||
""""""
|
||||
|
||||
* Added the methods :code:`getMinArguments` and :code:`getMaxArguments` to the :code:`Function` class. These return the minimum and maximum positional arguments that the given function accepts.
|
||||
|
||||
New Features
|
||||
~~~~~~~~~~~~
|
||||
|
||||
C/C++
|
||||
"""""
|
||||
|
||||
* Added :code:`Node.asUncertainDefinition` and :code:`Node.asCertainDefinition` to the :code:`DataFlow::Node` class for querying whether a definition overwrites the entire destination buffer.
|
||||
|
||||
JavaScript/TypeScript
|
||||
"""""""""""""""""""""
|
||||
|
||||
* Extraction now supports regular expressions with the :code:`v` flag, using the new operators:
|
||||
|
||||
* Intersection :code:`&&`
|
||||
* Subtraction :code:`--`
|
||||
* :code:`\q` quoted string
|
||||
|
||||
@@ -11,6 +11,8 @@ A list of queries for each suite and language `is available here <https://docs.g
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
codeql-cli-2.21.0
|
||||
codeql-cli-2.20.7
|
||||
codeql-cli-2.20.6
|
||||
codeql-cli-2.20.5
|
||||
codeql-cli-2.20.4
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* Local source models for APIs reading from databases have been added for `github.com/gogf/gf/database/gdb` and `github.com/uptrace/bun`.
|
||||
@@ -55,3 +55,76 @@ extensions:
|
||||
- ["github.com/gogf/gf/database/gdb", "Tx", True, "Prepare", "", "", "Argument[0]", "sql-injection", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Tx", True, "Query", "", "", "Argument[0]", "sql-injection", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Tx", True, "Raw", "", "", "Argument[0]", "sql-injection", "manual"]
|
||||
- addsTo:
|
||||
pack: codeql/go-all
|
||||
extensible: sourceModel
|
||||
data:
|
||||
# These models are for v1. Some of them hold for v2, but we should model v2 properly.
|
||||
- ["github.com/gogf/gf/database/gdb", "Core", True, "DoGetAll", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Core", True, "DoQuery", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Core", True, "GetAll", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Core", True, "GetArray", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Core", True, "GetOne", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Core", True, "GetScan", "", "", "Argument[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Core", True, "GetStruct", "", "", "Argument[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Core", True, "GetStructs", "", "", "Argument[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Core", True, "GetValue", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Core", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
|
||||
- ["github.com/gogf/gf/database/gdb", "DB", True, "DoGetAll", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "DB", True, "DoQuery", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "DB", True, "GetAll", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "DB", True, "GetArray", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "DB", True, "GetOne", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "DB", True, "GetScan", "", "", "Argument[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "DB", True, "GetValue", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "DB", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
|
||||
- ["github.com/gogf/gf/database/gdb", "Model", True, "All", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Model", True, "Array", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Model", True, "FindAll", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Model", True, "FindArray", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Model", True, "FindOne", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Model", True, "FindScan", "", "", "Argument[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Model", True, "FindValue", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Model", True, "One", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Model", True, "Scan", "", "", "Argument[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Model", True, "ScanList", "", "", "Argument[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Model", True, "Select", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Model", True, "Struct", "", "", "Argument[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Model", True, "Structs", "", "", "Argument[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Model", True, "Value", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
|
||||
- ["github.com/gogf/gf/database/gdb", "TX", True, "GetAll", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "TX", True, "GetOne", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "TX", True, "GetScan", "", "", "Argument[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "TX", True, "GetStruct", "", "", "Argument[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "TX", True, "GetStructs", "", "", "Argument[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "TX", True, "GetValue", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "TX", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- addsTo:
|
||||
pack: codeql/go-all
|
||||
extensible: summaryModel
|
||||
data:
|
||||
- ["github.com/gogf/gf/database/gdb", "Record", True, "GMap", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Record", True, "Interface", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Record", True, "Json", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Record", True, "Map", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Record", True, "Struct", "", "", "Argument[receiver]", "Argument[0]", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Record", True, "Xml", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"]
|
||||
|
||||
- ["github.com/gogf/gf/database/gdb", "Result", True, "Array", "", "", "Argument[receiver]", "ReturnValue.ArrayElement", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Result", True, "Chunk", "", "", "Argument[receiver]", "ReturnValue.ArrayElement", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Result", True, "Interface", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Result", True, "Json", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Result", True, "List", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Result", True, "MapKeyInt", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Result", True, "MapKeyStr", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Result", True, "MapKeyUint", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Result", True, "MapKeyValue", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Result", True, "RecordKeyInt", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Result", True, "RecordKeyStr", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Result", True, "RecordKeyUint", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Result", True, "ScanList", "", "", "Argument[receiver]", "Argument[0]", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Result", True, "Structs", "", "", "Argument[receiver]", "Argument[0]", "taint", "manual"]
|
||||
- ["github.com/gogf/gf/database/gdb", "Result", True, "Xml", "", "", "Argument[receiver]", "ReturnValue", "taint", "manual"]
|
||||
|
||||
@@ -1,4 +1,21 @@
|
||||
extensions:
|
||||
- addsTo:
|
||||
pack: codeql/go-all
|
||||
extensible: sourceModel
|
||||
data:
|
||||
- ["github.com/uptrace/bun", "DB", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/uptrace/bun", "DB", True, "QueryRow", "", "", "ReturnValue", "database", "manual"]
|
||||
- ["github.com/uptrace/bun", "IDB", True, "QueryContext", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/uptrace/bun", "IDB", True, "QueryRowContext", "", "", "ReturnValue", "database", "manual"]
|
||||
# - ["github.com/uptrace/bun", "RawQuery", True, "Exec", "", "", "Argument[0]", "database", "manual"] # Implemented in QL because variadic arguments as sources aren't supported in this format yet
|
||||
# - ["github.com/uptrace/bun", "RawQuery", True, "Scan", "", "", "Argument[0]", "database", "manual"] # Implemented in QL because variadic arguments as sources aren't supported in this format yet
|
||||
# - ["github.com/uptrace/bun", "SelectQuery", True, "Exec", "", "", "Argument[0]", "database", "manual"] # Implemented in QL because variadic arguments as sources aren't supported in this format yet
|
||||
- ["github.com/uptrace/bun", "SelectQuery", True, "Model", "", "", "Argument[0]", "database", "manual"]
|
||||
- ["github.com/uptrace/bun", "SelectQuery", True, "Rows", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
# - ["github.com/uptrace/bun", "SelectQuery", True, "Scan", "", "", "Argument[1]", "database", "manual"] # Implemented in QL because variadic arguments as sources aren't supported in this format yet
|
||||
# - ["github.com/uptrace/bun", "SelectQuery", True, "ScanAndCount", "", "", "Argument[1]", "database", "manual"] # Implemented in QL because variadic arguments as sources aren't supported in this format yet
|
||||
- ["github.com/uptrace/bun", "Tx", True, "Query", "", "", "ReturnValue[0]", "database", "manual"]
|
||||
- ["github.com/uptrace/bun", "Tx", True, "QueryRow", "", "", "ReturnValue", "database", "manual"]
|
||||
- addsTo:
|
||||
pack: codeql/go-all
|
||||
extensible: sinkModel
|
||||
@@ -66,3 +83,9 @@ extensions:
|
||||
- ["github.com/uptrace/bun", "UpdateQuery", True, "TableExpr", "", "", "Argument[0]", "sql-injection", "manual"]
|
||||
- ["github.com/uptrace/bun", "UpdateQuery", True, "Where", "", "", "Argument[0]", "sql-injection", "manual"]
|
||||
- ["github.com/uptrace/bun", "UpdateQuery", True, "WhereOr", "", "", "Argument[0]", "sql-injection", "manual"]
|
||||
# - addsTo:
|
||||
# pack: codeql/go-all
|
||||
# extensible: summaryModel
|
||||
# data:
|
||||
# - ["github.com/uptrace/bun", "DB", True, "ScanRow", "", "", "Argument[1]", "Argument[2].ArrayElement", "taint", "manual"] # Implemented in QL because variadic arguments as outputs aren't supported in this format yet
|
||||
# - ["github.com/uptrace/bun", "DB", True, "ScanRows", "", "", "Argument[1]", "Argument[2].ArrayElement", "taint", "manual"] # Implemented in QL because variadic arguments as outputs aren't supported in this format yet
|
||||
|
||||
@@ -32,6 +32,7 @@ import semmle.go.frameworks.Afero
|
||||
import semmle.go.frameworks.AwsLambda
|
||||
import semmle.go.frameworks.Beego
|
||||
import semmle.go.frameworks.BeegoOrm
|
||||
import semmle.go.frameworks.Bun
|
||||
import semmle.go.frameworks.RsCors
|
||||
import semmle.go.frameworks.Couchbase
|
||||
import semmle.go.frameworks.Echo
|
||||
|
||||
62
go/ql/lib/semmle/go/frameworks/Bun.qll
Normal file
62
go/ql/lib/semmle/go/frameworks/Bun.qll
Normal file
@@ -0,0 +1,62 @@
|
||||
/**
|
||||
* Provides classes modeling security-relevant aspects of the `Bun` package.
|
||||
*/
|
||||
|
||||
import go
|
||||
|
||||
/**
|
||||
* Provides classes modeling security-relevant aspects of the `Bun` package.
|
||||
*/
|
||||
private module Bun {
|
||||
private string packagePath() { result = package("github.com/uptrace/bun", "") }
|
||||
|
||||
private class RawQuerySources extends SourceNode {
|
||||
RawQuerySources() {
|
||||
// func (q *RawQuery) Exec(ctx context.Context, dest ...interface{}) (sql.Result, error)
|
||||
// func (q *RawQuery) Scan(ctx context.Context, dest ...interface{}) error
|
||||
exists(DataFlow::CallNode cn, int i |
|
||||
cn.getTarget().(Method).hasQualifiedName(packagePath(), "RawQuery", ["Exec", "Scan"]) and
|
||||
i >= 1
|
||||
|
|
||||
this = cn.getSyntacticArgument(i)
|
||||
)
|
||||
}
|
||||
|
||||
override string getThreatModel() { result = "database" }
|
||||
}
|
||||
|
||||
private class SelectQuerySources extends SourceNode {
|
||||
SelectQuerySources() {
|
||||
// func (q *SelectQuery) Exec(ctx context.Context, dest ...interface{}) (res sql.Result, err error)
|
||||
// func (q *SelectQuery) Scan(ctx context.Context, dest ...interface{}) error
|
||||
// func (q *SelectQuery) ScanAndCount(ctx context.Context, dest ...interface{}) (int, error)
|
||||
exists(DataFlow::CallNode cn, int i |
|
||||
cn.getTarget()
|
||||
.(Method)
|
||||
.hasQualifiedName(packagePath(), "SelectQuery", ["Exec", "Scan", "ScanAndCount"]) and
|
||||
i >= 1
|
||||
|
|
||||
this = cn.getSyntacticArgument(i)
|
||||
)
|
||||
}
|
||||
|
||||
override string getThreatModel() { result = "database" }
|
||||
}
|
||||
|
||||
private class DBScanRows extends TaintTracking::FunctionModel, Method {
|
||||
FunctionInput inp;
|
||||
FunctionOutput outp;
|
||||
|
||||
DBScanRows() {
|
||||
// func (db *DB) ScanRow(ctx context.Context, rows *sql.Rows, dest ...interface{}) error
|
||||
// func (db *DB) ScanRows(ctx context.Context, rows *sql.Rows, dest ...interface{}) error
|
||||
this.hasQualifiedName(packagePath(), "DB", ["ScanRow", "ScanRows"]) and
|
||||
inp.isParameter(1) and
|
||||
outp.isParameter(any(int i | i >= 2))
|
||||
}
|
||||
|
||||
override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {
|
||||
input = inp and output = outp
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,12 +7,13 @@ require (
|
||||
github.com/beego/beego/v2 v2.3.5
|
||||
github.com/couchbase/gocb v1.6.7
|
||||
github.com/couchbase/gocb/v2 v2.9.4
|
||||
github.com/gogf/gf v1.16.9
|
||||
github.com/jmoiron/sqlx v1.4.0
|
||||
github.com/Masterminds/squirrel v1.5.4
|
||||
github.com/rqlite/gorqlite v0.0.0-20250128004930-114c7828b55a
|
||||
github.com/uptrace/bun v1.2.11
|
||||
go.mongodb.org/mongo-driver v1.17.3
|
||||
gorm.io/gorm v1.25.12
|
||||
github.com/nonexistent/sources v0.0.0-20250300000000-000000000000
|
||||
)
|
||||
|
||||
require (
|
||||
|
||||
@@ -8,4 +8,4 @@ extensions:
|
||||
pack: codeql/go-all
|
||||
extensible: sourceModel
|
||||
data:
|
||||
- ["github.com/nonexistent/sources", "", False, "Source", "", "", "ReturnValue", "database", "manual"]
|
||||
- ["test", "", False, "Source", "", "", "ReturnValue", "database", "manual"]
|
||||
|
||||
@@ -10,4 +10,4 @@ extensions:
|
||||
pack: codeql/go-all
|
||||
extensible: sourceModel
|
||||
data:
|
||||
- ["github.com/nonexistent/sources", "", False, "Source", "", "", "ReturnValue", "database", "manual"]
|
||||
- ["test", "", False, "Source", "", "", "ReturnValue", "database", "manual"]
|
||||
|
||||
@@ -6,9 +6,12 @@ import (
|
||||
"context"
|
||||
|
||||
"github.com/Masterminds/squirrel"
|
||||
src "github.com/nonexistent/sources"
|
||||
)
|
||||
|
||||
func Source[T any]() T {
|
||||
return *new(T)
|
||||
}
|
||||
|
||||
func test_Masterminds_squirrel_QueryRower(ctx context.Context, db squirrel.QueryRower, sqlizer squirrel.Sqlizer) {
|
||||
scanner := db.QueryRow("") // $ source
|
||||
|
||||
@@ -136,7 +139,7 @@ func test_Masterminds_squirrel_DeleteBuilder(ctx context.Context, builder squirr
|
||||
sink(r32) // $ hasTaintFlow="r32"
|
||||
sink(r33) // $ hasTaintFlow="r33"
|
||||
|
||||
builder2 := src.Source[squirrel.DeleteBuilder]() // $ source
|
||||
builder2 := Source[squirrel.DeleteBuilder]() // $ source
|
||||
|
||||
var r41, r42, r43 string
|
||||
builder2.ScanContext(ctx, &r41, &r42, &r43)
|
||||
@@ -177,7 +180,7 @@ func test_Masterminds_squirrel_InsertBuilder(ctx context.Context, builder squirr
|
||||
sink(r42) // $ hasTaintFlow="r42"
|
||||
sink(r43) // $ hasTaintFlow="r43"
|
||||
|
||||
builder2 := src.Source[squirrel.InsertBuilder]() // $ source
|
||||
builder2 := Source[squirrel.InsertBuilder]() // $ source
|
||||
|
||||
var r51, r52, r53 string
|
||||
builder2.Scan(&r51, &r52, &r53)
|
||||
@@ -225,7 +228,7 @@ func test_Masterminds_squirrel_SelectBuilder(ctx context.Context, builder squirr
|
||||
sink(r42) // $ hasTaintFlow="r42"
|
||||
sink(r43) // $ hasTaintFlow="r43"
|
||||
|
||||
builder2 := src.Source[squirrel.SelectBuilder]() // $ source
|
||||
builder2 := Source[squirrel.SelectBuilder]() // $ source
|
||||
|
||||
var r51, r52, r53 string
|
||||
builder2.Scan(&r51, &r52, &r53)
|
||||
@@ -273,7 +276,7 @@ func test_Masterminds_squirrel_UpdateBuilder(ctx context.Context, builder squirr
|
||||
sink(r42) // $ hasTaintFlow="r42"
|
||||
sink(r43) // $ hasTaintFlow="r43"
|
||||
|
||||
builder2 := src.Source[squirrel.UpdateBuilder]() // $ source
|
||||
builder2 := Source[squirrel.UpdateBuilder]() // $ source
|
||||
|
||||
var r51, r52, r53 string
|
||||
builder2.Scan(&r51, &r52, &r53)
|
||||
|
||||
@@ -0,0 +1,242 @@
|
||||
package test
|
||||
|
||||
//go:generate depstubber -vendor github.com/gogf/gf/database/gdb Core,DB,Model,TX,Record,Result
|
||||
|
||||
import (
|
||||
"github.com/gogf/gf/database/gdb"
|
||||
)
|
||||
|
||||
func gogf_Core(g gdb.Core) {
|
||||
v1, _ := g.DoGetAll(nil, nil, "SELECT user from users") // $ source
|
||||
sink(v1) // $ hasTaintFlow="v1"
|
||||
|
||||
v2, _ := g.DoQuery(nil, nil, "SELECT user from users") // $ source
|
||||
sink(v2) // $ hasTaintFlow="v2"
|
||||
|
||||
v3, _ := g.GetAll("SELECT user from users") // $ source
|
||||
sink(v3) // $ hasTaintFlow="v3"
|
||||
|
||||
v4, _ := g.GetArray("SELECT user from users") // $ source
|
||||
sink(v4) // $ hasTaintFlow="v4"
|
||||
|
||||
v5, _ := g.GetOne("SELECT user from users") // $ source
|
||||
sink(v5) // $ hasTaintFlow="v5"
|
||||
|
||||
var v6 User
|
||||
g.GetScan(&v6, "SELECT user from users") // $ source
|
||||
sink(v6) // $ hasTaintFlow="v6"
|
||||
|
||||
var v7 User
|
||||
g.GetStruct(&v7, "SELECT user from users") // $ source
|
||||
sink(v7) // $ hasTaintFlow="v7"
|
||||
|
||||
var v8 []User // $ source
|
||||
g.GetStructs(v8, "SELECT user from users")
|
||||
sink(v8) // $ hasTaintFlow="v8"
|
||||
|
||||
v9, _ := g.GetValue("SELECT user from users") // $ source
|
||||
sink(v9) // $ hasTaintFlow="v9"
|
||||
|
||||
v10, _ := g.Query("SELECT user from users") // $ source
|
||||
sink(v10) // $ hasTaintFlow="v10"
|
||||
}
|
||||
|
||||
func gogf_DB(g gdb.DB) {
|
||||
v1, _ := g.DoGetAll(nil, nil, "SELECT user from users") // $ source
|
||||
sink(v1) // $ hasTaintFlow="v1"
|
||||
|
||||
v2, _ := g.DoQuery(nil, nil, "SELECT user from users") // $ source
|
||||
sink(v2) // $ hasTaintFlow="v2"
|
||||
|
||||
v3, _ := g.GetAll("SELECT user from users") // $ source
|
||||
sink(v3) // $ hasTaintFlow="v3"
|
||||
|
||||
v4, _ := g.GetArray("SELECT user from users") // $ source
|
||||
sink(v4) // $ hasTaintFlow="v4"
|
||||
|
||||
v5, _ := g.GetOne("SELECT user from users") // $ source
|
||||
sink(v5) // $ hasTaintFlow="v5"
|
||||
|
||||
var v6 User
|
||||
g.GetScan(&v6, "SELECT user from users") // $ source
|
||||
sink(v6) // $ hasTaintFlow="v6"
|
||||
|
||||
v7, _ := g.GetValue("SELECT user from users") // $ source
|
||||
sink(v7) // $ hasTaintFlow="v7"
|
||||
|
||||
v8, _ := g.Query("SELECT user from users") // $ source
|
||||
sink(v8) // $ hasTaintFlow="v8"
|
||||
}
|
||||
|
||||
func gogf_Model(g gdb.Model) {
|
||||
v1, _ := g.All() // $ source
|
||||
sink(v1) // $ hasTaintFlow="v1"
|
||||
|
||||
v2, _ := g.Array() // $ source
|
||||
sink(v2) // $ hasTaintFlow="v2"
|
||||
|
||||
v3, _ := g.FindAll() // $ source
|
||||
sink(v3) // $ hasTaintFlow="v3"
|
||||
|
||||
v4, _ := g.FindArray() // $ source
|
||||
sink(v4) // $ hasTaintFlow="v4"
|
||||
|
||||
v5, _ := g.FindOne() // $ source
|
||||
sink(v5) // $ hasTaintFlow="v5"
|
||||
|
||||
var v6 User
|
||||
g.FindScan(&v6) // $ source
|
||||
sink(v6) // $ hasTaintFlow="v6"
|
||||
|
||||
v7, _ := g.FindValue() // $ source
|
||||
sink(v7) // $ hasTaintFlow="v7"
|
||||
|
||||
v8, _ := g.One() // $ source
|
||||
sink(v8) // $ hasTaintFlow="v8"
|
||||
|
||||
var v9 User
|
||||
g.Scan(&v9) // $ source
|
||||
sink(v9) // $ hasTaintFlow="v9"
|
||||
|
||||
var v10 []User
|
||||
g.ScanList(&v10, "") // $ source
|
||||
sink(v10) // $ hasTaintFlow="v10"
|
||||
|
||||
v11, _ := g.Select() // $ source
|
||||
sink(v11) // $ hasTaintFlow="v11"
|
||||
|
||||
var v12 User
|
||||
g.Struct(&v12) // $ source
|
||||
sink(v12) // $ hasTaintFlow="v12"
|
||||
|
||||
var v13 []User
|
||||
g.Structs(&v13, "") // $ source
|
||||
sink(v13) // $ hasTaintFlow="v13"
|
||||
|
||||
v14, _ := g.Value() // $ source
|
||||
sink(v14) // $ hasTaintFlow="v14"
|
||||
}
|
||||
|
||||
func gogf_TX(g gdb.TX) {
|
||||
v1, _ := g.GetAll("SELECT user from users") // $ source
|
||||
sink(v1) // $ hasTaintFlow="v1"
|
||||
|
||||
v2, _ := g.GetOne("SELECT user from users") // $ source
|
||||
sink(v2) // $ hasTaintFlow="v2"
|
||||
|
||||
var v3 User
|
||||
g.GetScan(&v3, "SELECT user from users") // $ source
|
||||
sink(v3) // $ hasTaintFlow="v3"
|
||||
|
||||
var v4 User
|
||||
g.GetStruct(&v4, "SELECT user from users") // $ source
|
||||
sink(v4) // $ hasTaintFlow="v4"
|
||||
|
||||
var v5 []User // $ source
|
||||
g.GetStructs(v5, "SELECT user from users")
|
||||
sink(v5) // $ hasTaintFlow="v5"
|
||||
|
||||
v6, _ := g.GetValue("SELECT user from users") // $ source
|
||||
sink(v6) // $ hasTaintFlow="v6"
|
||||
|
||||
v7, _ := g.Query("SELECT user from users") // $ source
|
||||
sink(v7) // $ hasTaintFlow="v7"
|
||||
}
|
||||
|
||||
func gogf_Record_summary(g gdb.Core) {
|
||||
record1, _ := g.GetOne("SELECT summary from records") // $ source
|
||||
gmap := record1.GMap()
|
||||
sink(gmap) // $ hasTaintFlow="gmap"
|
||||
|
||||
record2, _ := g.GetOne("SELECT summary from records") // $ source
|
||||
interface_ := record2.Interface()
|
||||
sink(interface_) // $ hasTaintFlow="interface_"
|
||||
|
||||
record3, _ := g.GetOne("SELECT summary from records") // $ source
|
||||
json := record3.Json()
|
||||
sink(json) // $ hasTaintFlow="json"
|
||||
|
||||
record4, _ := g.GetOne("SELECT summary from records") // $ source
|
||||
map_ := record4.Map()
|
||||
sink(map_) // $ hasTaintFlow="map_"
|
||||
|
||||
record5, _ := g.GetOne("SELECT summary from records") // $ source
|
||||
var struct_ struct{}
|
||||
record5.Struct(&struct_)
|
||||
sink(struct_) // $ hasTaintFlow="struct_"
|
||||
|
||||
record6, _ := g.GetOne("SELECT summary from records") // $ source
|
||||
xml := record6.Xml()
|
||||
sink(xml) // $ hasTaintFlow="xml"
|
||||
|
||||
// Note: currently missing models for methods on return type of `GMap`,
|
||||
// which is `StrAnyMap` from package "github.com/gogf/gf/container/gmap".
|
||||
}
|
||||
|
||||
func gogf_Result_summary(g gdb.Core) {
|
||||
result1, _ := g.GetAll("SELECT summary from records") // $ source
|
||||
array := result1.Array()
|
||||
sink(array) // $ hasTaintFlow="array"
|
||||
|
||||
result2, _ := g.GetAll("SELECT summary from records") // $ source
|
||||
chunk := result2.Chunk(1)
|
||||
sink(chunk) // $ hasTaintFlow="chunk"
|
||||
|
||||
result3, _ := g.GetAll("SELECT summary from records") // $ source
|
||||
interface_ := result3.Interface()
|
||||
sink(interface_) // $ hasTaintFlow="interface_"
|
||||
|
||||
result4, _ := g.GetAll("SELECT summary from records") // $ source
|
||||
json := result4.Json()
|
||||
sink(json) // $ hasTaintFlow="json"
|
||||
|
||||
result5, _ := g.GetAll("SELECT summary from records") // $ source
|
||||
list := result5.List()
|
||||
sink(list) // $ hasTaintFlow="list"
|
||||
|
||||
result6, _ := g.GetAll("SELECT summary from records") // $ source
|
||||
mapkeyint := result6.MapKeyInt("")
|
||||
sink(mapkeyint) // $ hasTaintFlow="mapkeyint"
|
||||
|
||||
result7, _ := g.GetAll("SELECT summary from records") // $ source
|
||||
mapkeystr := result7.MapKeyStr("")
|
||||
sink(mapkeystr) // $ hasTaintFlow="mapkeystr"
|
||||
|
||||
result8, _ := g.GetAll("SELECT summary from records") // $ source
|
||||
mapkeyuint := result8.MapKeyUint("")
|
||||
sink(mapkeyuint) // $ hasTaintFlow="mapkeyuint"
|
||||
|
||||
result9, _ := g.GetAll("SELECT summary from records") // $ source
|
||||
mapkeyvalue := result9.MapKeyValue("")
|
||||
sink(mapkeyvalue) // $ hasTaintFlow="mapkeyvalue"
|
||||
|
||||
result10, _ := g.GetAll("SELECT summary from records") // $ source
|
||||
recordkeyint := result10.RecordKeyInt("")
|
||||
sink(recordkeyint) // $ hasTaintFlow="recordkeyint"
|
||||
|
||||
result11, _ := g.GetAll("SELECT summary from records") // $ source
|
||||
recordkeystr := result11.RecordKeyStr("")
|
||||
sink(recordkeystr) // $ hasTaintFlow="recordkeystr"
|
||||
|
||||
result12, _ := g.GetAll("SELECT summary from records") // $ source
|
||||
recordkeyuint := result12.RecordKeyUint("")
|
||||
sink(recordkeyuint) // $ hasTaintFlow="recordkeyuint"
|
||||
|
||||
result13, _ := g.GetAll("SELECT summary from records") // $ source
|
||||
var structslice1 []struct{}
|
||||
result13.ScanList(&structslice1, "")
|
||||
sink(structslice1) // $ hasTaintFlow="structslice1"
|
||||
|
||||
result14, _ := g.GetAll("SELECT summary from records") // $ source
|
||||
var structslice2 []struct{}
|
||||
result14.Structs(&structslice2)
|
||||
sink(structslice2) // $ hasTaintFlow="structslice2"
|
||||
|
||||
result15, _ := g.GetAll("SELECT summary from records") // $ source
|
||||
xml := result15.Xml()
|
||||
sink(xml) // $ hasTaintFlow="xml"
|
||||
|
||||
// Note: currently missing models for methods on the type `Var` from
|
||||
// package "github.com/gogf/gf/container/gvar", which is involved in the
|
||||
// return type of `Array` and `MapKeyValue`.
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
package test
|
||||
|
||||
//go:generate depstubber -vendor github.com/uptrace/bun Conn,DB,RawQuery,SelectQuery,Tx
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/uptrace/bun"
|
||||
)
|
||||
|
||||
func Test_bun_conn(conn bun.Conn) {
|
||||
ctx := context.Background()
|
||||
|
||||
rows1, _ := conn.QueryContext(ctx, "SELECT * FROM users") // $ source
|
||||
conn.QueryRowContext(ctx, "SELECT * FROM users") // $ source
|
||||
|
||||
ignore(rows1)
|
||||
}
|
||||
|
||||
func Test_bun_db(db bun.DB) {
|
||||
ctx := context.Background()
|
||||
|
||||
rows1, _ := db.Query("SELECT * FROM users") // $ source
|
||||
|
||||
for rows1.Next() {
|
||||
var user User
|
||||
db.ScanRow(ctx, rows1, &user)
|
||||
sink(user) // $ hasTaintFlow="user"
|
||||
}
|
||||
|
||||
rows2, _ := db.QueryContext(ctx, "SELECT * FROM users") // $ source
|
||||
var users []User
|
||||
|
||||
db.ScanRows(ctx, rows2, &users)
|
||||
sink(users) // $ hasTaintFlow="users"
|
||||
|
||||
db.QueryRow("SELECT * FROM users") // $ source
|
||||
db.QueryRowContext(ctx, "SELECT * FROM users") // $ source
|
||||
}
|
||||
|
||||
func Test_bun_rawquery(q bun.RawQuery) {
|
||||
ctx := context.Background()
|
||||
|
||||
var u1 []User
|
||||
q.Exec(ctx, &u1) // $ source
|
||||
var u2 []User
|
||||
q.Scan(ctx, &u2) // $ source
|
||||
}
|
||||
|
||||
func Test_bun_selectquery(q bun.SelectQuery) {
|
||||
ctx := context.Background()
|
||||
|
||||
rows, _ := q.Rows(ctx) // $ source
|
||||
var u1 []User
|
||||
q.Exec(ctx, &u1) // $ source
|
||||
var u2 []User
|
||||
q.Model(&u2).Scan(ctx) // $ source
|
||||
var u3 map[string]interface{}
|
||||
q.Scan(ctx, &u3) // $ source
|
||||
var u4 []User
|
||||
q.Model(&u4).ScanAndCount(ctx) // $ source
|
||||
var u5 map[string]interface{}
|
||||
q.ScanAndCount(ctx, &u5) // $ source
|
||||
|
||||
ignore(rows)
|
||||
}
|
||||
|
||||
func Test_bun_tx(tx bun.Tx) {
|
||||
ctx := context.Background()
|
||||
|
||||
rows1, _ := tx.Query("SELECT * FROM users") // $ source
|
||||
rows2, _ := tx.QueryContext(ctx, "SELECT * FROM users") // $ source
|
||||
tx.QueryRow("SELECT * FROM users") // $ source
|
||||
tx.QueryRowContext(ctx, "SELECT * FROM users") // $ source
|
||||
|
||||
ignore(rows1, rows2)
|
||||
}
|
||||
1175
go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/github.com/gogf/gf/database/gdb/stub.go
generated
vendored
Normal file
1175
go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/github.com/gogf/gf/database/gdb/stub.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +0,0 @@
|
||||
package sources
|
||||
|
||||
func Source[T any]() T {
|
||||
return *new(T)
|
||||
}
|
||||
2763
go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/github.com/uptrace/bun/stub.go
generated
vendored
Normal file
2763
go/ql/test/library-tests/semmle/go/dataflow/flowsources/local/database/vendor/github.com/uptrace/bun/stub.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@@ -10,6 +10,9 @@ github.com/couchbase/gocb
|
||||
# github.com/couchbase/gocb/v2 v2.9.4
|
||||
## explicit
|
||||
github.com/couchbase/gocb/v2
|
||||
# github.com/gogf/gf v1.16.9
|
||||
## explicit
|
||||
github.com/gogf/gf/database/gdb
|
||||
# github.com/jmoiron/sqlx v1.4.0
|
||||
## explicit
|
||||
github.com/jmoiron/sqlx
|
||||
@@ -19,15 +22,15 @@ github.com/Masterminds/squirrel
|
||||
# github.com/rqlite/gorqlite v0.0.0-20250128004930-114c7828b55a
|
||||
## explicit
|
||||
github.com/rqlite/gorqlite
|
||||
# github.com/uptrace/bun v1.2.11
|
||||
## explicit
|
||||
github.com/uptrace/bun
|
||||
# go.mongodb.org/mongo-driver v1.17.3
|
||||
## explicit
|
||||
go.mongodb.org/mongo-driver/mongo
|
||||
# gorm.io/gorm v1.25.12
|
||||
## explicit
|
||||
gorm.io/gorm
|
||||
# github.com/nonexistent/sources v0.0.0-20250300000000-000000000000
|
||||
## explicit
|
||||
github.com/nonexistent/sources
|
||||
# github.com/couchbase/gocbcore/v10 v10.5.4
|
||||
## explicit
|
||||
github.com/couchbase/gocbcore/v10
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* @name Usage of supported APIs coming from external libraries
|
||||
* @description A list of supported 3rd party APIs used in the codebase. Excludes test and generated code.
|
||||
* @kind metric
|
||||
* @tags summary telemetry
|
||||
* @tags summary telemetry exclude-from-incremental
|
||||
* @id java/telemetry/supported-external-api
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* @name Supported sinks in external libraries
|
||||
* @description A list of 3rd party APIs detected as sinks. Excludes test and generated code.
|
||||
* @kind metric
|
||||
* @tags summary telemetry
|
||||
* @tags summary telemetry exclude-from-incremental
|
||||
* @id java/telemetry/supported-external-api-sinks
|
||||
*/
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* @name Usage of unsupported APIs coming from external libraries
|
||||
* @description A list of 3rd party APIs used in the codebase. Excludes test and generated code.
|
||||
* @kind metric
|
||||
* @tags summary telemetry
|
||||
* @tags summary telemetry exclude-from-incremental
|
||||
* @id java/telemetry/unsupported-external-api
|
||||
*/
|
||||
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
---
|
||||
category: minorAnalysis
|
||||
---
|
||||
* Calls to `super` without explict arguments now have their implicit arguments generated. For example, in `def foo(x, y) { super } end` the call to `super` becomes `super(x, y)`.
|
||||
@@ -248,13 +248,7 @@ class ParenthesizedExpr extends StmtSequence, TParenthesizedExpr {
|
||||
* baz(qux: 1)
|
||||
* ```
|
||||
*/
|
||||
class Pair extends Expr, TPair {
|
||||
private Ruby::Pair g;
|
||||
|
||||
Pair() { this = TPair(g) }
|
||||
|
||||
final override string getAPrimaryQlClass() { result = "Pair" }
|
||||
|
||||
class Pair extends Expr instanceof PairImpl {
|
||||
/**
|
||||
* Gets the key expression of this pair. For example, the `SymbolLiteral`
|
||||
* representing the keyword `foo` in the following example:
|
||||
@@ -266,7 +260,7 @@ class Pair extends Expr, TPair {
|
||||
* { 'foo' => 123 }
|
||||
* ```
|
||||
*/
|
||||
final Expr getKey() { toGenerated(result) = g.getKey() }
|
||||
final Expr getKey() { result = PairImpl.super.getKey() }
|
||||
|
||||
/**
|
||||
* Gets the value expression of this pair. For example, the `IntegerLiteral`
|
||||
@@ -275,20 +269,9 @@ class Pair extends Expr, TPair {
|
||||
* { 'foo' => 123 }
|
||||
* ```
|
||||
*/
|
||||
final Expr getValue() {
|
||||
toGenerated(result) = g.getValue() or
|
||||
synthChild(this, 0, result)
|
||||
}
|
||||
final Expr getValue() { result = PairImpl.super.getValue() }
|
||||
|
||||
final override string toString() { result = "Pair" }
|
||||
|
||||
final override AstNode getAChild(string pred) {
|
||||
result = super.getAChild(pred)
|
||||
or
|
||||
pred = "getKey" and result = this.getKey()
|
||||
or
|
||||
pred = "getValue" and result = this.getValue()
|
||||
}
|
||||
final override string getAPrimaryQlClass() { result = "Pair" }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -305,7 +305,9 @@ class StringlikeLiteral extends Literal instanceof StringlikeLiteralImpl {
|
||||
final override AstNode getAChild(string pred) {
|
||||
result = Literal.super.getAChild(pred)
|
||||
or
|
||||
pred = "getComponent" and result = this.getComponent(_)
|
||||
pred = "getComponent" and
|
||||
result = this.getComponent(_) and
|
||||
not this instanceof SimpleSymbolLiteralSynth
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -92,10 +92,6 @@ class SplatExpr extends UnaryOperation, TSplatExpr {
|
||||
* ```
|
||||
*/
|
||||
class HashSplatExpr extends UnaryOperation, THashSplatExpr {
|
||||
private Ruby::HashSplatArgument g;
|
||||
|
||||
HashSplatExpr() { this = THashSplatExpr(g) }
|
||||
|
||||
final override string getAPrimaryQlClass() { result = "HashSplatExpr" }
|
||||
}
|
||||
|
||||
|
||||
@@ -164,7 +164,8 @@ private module Cached {
|
||||
THashKeySymbolLiteral(Ruby::HashKeySymbol g) or
|
||||
THashLiteral(Ruby::Hash g) or
|
||||
THashPattern(Ruby::HashPattern g) or
|
||||
THashSplatExpr(Ruby::HashSplatArgument g) or
|
||||
THashSplatExprReal(Ruby::HashSplatArgument g) or
|
||||
THashSplatExprSynth(Ast::AstNode parent, int i) { mkSynthChild(HashSplatExprKind(), parent, i) } or
|
||||
THashSplatNilParameter(Ruby::HashSplatNil g) { not g.getParent() instanceof Ruby::HashPattern } or
|
||||
THashSplatParameter(Ruby::HashSplatParameter g) {
|
||||
not g.getParent() instanceof Ruby::HashPattern
|
||||
@@ -232,7 +233,8 @@ private module Cached {
|
||||
TNotExprReal(Ruby::Unary g) { g instanceof @ruby_unary_bang or g instanceof @ruby_unary_not } or
|
||||
TNotExprSynth(Ast::AstNode parent, int i) { mkSynthChild(NotExprKind(), parent, i) } or
|
||||
TOptionalParameter(Ruby::OptionalParameter g) or
|
||||
TPair(Ruby::Pair g) or
|
||||
TPairReal(Ruby::Pair g) or
|
||||
TPairSynth(Ast::AstNode parent, int i) { mkSynthChild(PairExprKind(), parent, i) } or
|
||||
TParenthesizedExpr(Ruby::ParenthesizedStatements g) or
|
||||
TParenthesizedPattern(Ruby::ParenthesizedPattern g) or
|
||||
TRShiftExprReal(Ruby::Binary g) { g instanceof @ruby_binary_ranglerangle } or
|
||||
@@ -274,7 +276,10 @@ private module Cached {
|
||||
TSimpleParameterSynth(Ast::AstNode parent, int i) {
|
||||
mkSynthChild(SimpleParameterKind(), parent, i)
|
||||
} or
|
||||
TSimpleSymbolLiteral(Ruby::SimpleSymbol g) or
|
||||
TSimpleSymbolLiteralReal(Ruby::SimpleSymbol g) or
|
||||
TSimpleSymbolLiteralSynth(Ast::AstNode parent, int i, string value) {
|
||||
mkSynthChild(SymbolLiteralExprKind(value), parent, i)
|
||||
} or
|
||||
TSingletonClass(Ruby::SingletonClass g) or
|
||||
TSingletonMethod(Ruby::SingletonMethod g) or
|
||||
TSpaceshipExpr(Ruby::Binary g) { g instanceof @ruby_binary_langleequalrangle } or
|
||||
@@ -362,19 +367,19 @@ private module Cached {
|
||||
TEnsure or TEqExpr or TExponentExprReal or TFalseLiteral or TFile or TFindPattern or
|
||||
TFloatLiteral or TForExpr or TForwardParameter or TForwardArgument or TGEExpr or TGTExpr or
|
||||
TGlobalVariableAccessReal or THashKeySymbolLiteral or THashLiteral or THashPattern or
|
||||
THashSplatExpr or THashSplatNilParameter or THashSplatParameter or THereDoc or
|
||||
THashSplatExprReal or THashSplatNilParameter or THashSplatParameter or THereDoc or
|
||||
TIdentifierMethodCall or TIfReal or TIfModifierExpr or TInClauseReal or
|
||||
TInstanceVariableAccessReal or TIntegerLiteralReal or TKeywordParameter or TLEExpr or
|
||||
TLShiftExprReal or TLTExpr or TLambda or TLeftAssignmentList or TLine or
|
||||
TLocalVariableAccessReal or TLogicalAndExprReal or TLogicalOrExprReal or TMethod or
|
||||
TMatchPattern or TModuleDeclaration or TModuloExprReal or TMulExprReal or TNEExpr or
|
||||
TNextStmt or TNilLiteralReal or TNoRegExpMatchExpr or TNotExprReal or TOptionalParameter or
|
||||
TPair or TParenthesizedExpr or TParenthesizedPattern or TRShiftExprReal or
|
||||
TPairReal or TParenthesizedExpr or TParenthesizedPattern or TRShiftExprReal or
|
||||
TRangeLiteralReal or TRationalLiteral or TRedoStmt or TRegExpLiteral or TRegExpMatchExpr or
|
||||
TRegularArrayLiteral or TRegularMethodCall or TRegularStringLiteral or TRegularSuperCall or
|
||||
TRescueClause or TRescueModifierExpr or TRetryStmt or TReturnStmt or
|
||||
TScopeResolutionConstantAccess or TSelfReal or TSimpleParameterReal or
|
||||
TSimpleSymbolLiteral or TSingletonClass or TSingletonMethod or TSpaceshipExpr or
|
||||
TSimpleSymbolLiteralReal or TSingletonClass or TSingletonMethod or TSpaceshipExpr or
|
||||
TSplatExprReal or TSplatParameter or TStringArrayLiteral or TStringConcatenation or
|
||||
TStringEscapeSequenceComponent or TStringInterpolationComponent or TStringTextComponent or
|
||||
TSubExprReal or TSubshellLiteral or TSymbolArrayLiteral or TTernaryIfExpr or TTestPattern or
|
||||
@@ -392,7 +397,8 @@ private module Cached {
|
||||
TLShiftExprSynth or TLocalVariableAccessSynth or TLogicalAndExprSynth or
|
||||
TLogicalOrExprSynth or TMethodCallSynth or TModuloExprSynth or TMulExprSynth or
|
||||
TNilLiteralSynth or TRShiftExprSynth or TRangeLiteralSynth or TSelfSynth or
|
||||
TSimpleParameterSynth or TSplatExprSynth or TStmtSequenceSynth or TSubExprSynth;
|
||||
TSimpleParameterSynth or TSplatExprSynth or THashSplatExprSynth or TStmtSequenceSynth or
|
||||
TSubExprSynth or TPairSynth or TSimpleSymbolLiteralSynth;
|
||||
|
||||
/**
|
||||
* Gets the underlying TreeSitter entity for a given AST node. This does not
|
||||
@@ -468,7 +474,7 @@ private module Cached {
|
||||
n = THashKeySymbolLiteral(result) or
|
||||
n = THashLiteral(result) or
|
||||
n = THashPattern(result) or
|
||||
n = THashSplatExpr(result) or
|
||||
n = THashSplatExprReal(result) or
|
||||
n = THashSplatNilParameter(result) or
|
||||
n = THashSplatParameter(result) or
|
||||
n = THereDoc(result) or
|
||||
@@ -499,7 +505,7 @@ private module Cached {
|
||||
n = TNoRegExpMatchExpr(result) or
|
||||
n = TNotExprReal(result) or
|
||||
n = TOptionalParameter(result) or
|
||||
n = TPair(result) or
|
||||
n = TPairReal(result) or
|
||||
n = TParenthesizedExpr(result) or
|
||||
n = TParenthesizedPattern(result) or
|
||||
n = TRangeLiteralReal(result) or
|
||||
@@ -519,7 +525,7 @@ private module Cached {
|
||||
n = TScopeResolutionConstantAccess(result, _) or
|
||||
n = TSelfReal(result) or
|
||||
n = TSimpleParameterReal(result) or
|
||||
n = TSimpleSymbolLiteral(result) or
|
||||
n = TSimpleSymbolLiteralReal(result) or
|
||||
n = TSingletonClass(result) or
|
||||
n = TSingletonMethod(result) or
|
||||
n = TSpaceshipExpr(result) or
|
||||
@@ -633,9 +639,15 @@ private module Cached {
|
||||
or
|
||||
result = TSplatExprSynth(parent, i)
|
||||
or
|
||||
result = THashSplatExprSynth(parent, i)
|
||||
or
|
||||
result = TStmtSequenceSynth(parent, i)
|
||||
or
|
||||
result = TSubExprSynth(parent, i)
|
||||
or
|
||||
result = TPairSynth(parent, i)
|
||||
or
|
||||
result = TSimpleSymbolLiteralSynth(parent, i, _)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -726,6 +738,8 @@ class TSelf = TSelfReal or TSelfSynth;
|
||||
|
||||
class TDestructuredLhsExpr = TDestructuredLeftAssignment or TLeftAssignmentList;
|
||||
|
||||
class TPair = TPairReal or TPairSynth;
|
||||
|
||||
class TExpr =
|
||||
TSelf or TArgumentList or TRescueClause or TRescueModifierExpr or TPair or TStringConcatenation or
|
||||
TCall or TBlockArgument or TConstantAccess or TControlExpr or TLiteral or TCallable or
|
||||
@@ -734,6 +748,8 @@ class TExpr =
|
||||
|
||||
class TSplatExpr = TSplatExprReal or TSplatExprSynth;
|
||||
|
||||
class THashSplatExpr = THashSplatExprReal or THashSplatExprSynth;
|
||||
|
||||
class TElse = TElseReal or TElseSynth;
|
||||
|
||||
class TStmtSequence =
|
||||
@@ -768,13 +784,16 @@ class TStringInterpolationComponent =
|
||||
TStringInterpolationComponentNonRegexp or TStringInterpolationComponentRegexp;
|
||||
|
||||
class TStringComponent =
|
||||
TStringTextComponent or TStringEscapeSequenceComponent or TStringInterpolationComponent;
|
||||
TStringTextComponent or TStringEscapeSequenceComponent or TStringInterpolationComponent or
|
||||
TSimpleSymbolLiteralSynth;
|
||||
|
||||
class TStringlikeLiteral =
|
||||
TStringLiteral or TRegExpLiteral or TSymbolLiteral or TSubshellLiteral or THereDoc;
|
||||
|
||||
class TStringLiteral = TRegularStringLiteral or TBareStringLiteral;
|
||||
|
||||
class TSimpleSymbolLiteral = TSimpleSymbolLiteralReal or TSimpleSymbolLiteralSynth;
|
||||
|
||||
class TSymbolLiteral = TSimpleSymbolLiteral or TComplexSymbolLiteral or THashKeySymbolLiteral;
|
||||
|
||||
class TComplexSymbolLiteral = TDelimitedSymbolLiteral or TBareSymbolLiteral;
|
||||
|
||||
@@ -2,6 +2,7 @@ private import TreeSitter
|
||||
private import Variable
|
||||
private import codeql.ruby.AST
|
||||
private import codeql.ruby.ast.internal.AST
|
||||
private import codeql.ruby.ast.internal.Scope
|
||||
|
||||
predicate isIdentifierMethodCall(Ruby::Identifier g) { vcall(g) and not access(g, _) }
|
||||
|
||||
@@ -133,18 +134,61 @@ private string getSuperMethodName(Ruby::Super sup) {
|
||||
)
|
||||
}
|
||||
|
||||
private Ruby::Identifier getParameter(Ruby::Method m, int pos, Ruby::AstNode param) {
|
||||
scopeDefinesParameterVariable(m, _, result, pos) and
|
||||
param = m.getParameters().getChild(pos)
|
||||
}
|
||||
|
||||
class TokenSuperCall extends SuperCallImpl, TTokenSuperCall {
|
||||
private Ruby::Super g;
|
||||
|
||||
TokenSuperCall() { this = TTokenSuperCall(g) }
|
||||
|
||||
Ruby::Method getEnclosingMethod() { result = scopeOf(toGenerated(this)).getEnclosingMethod() }
|
||||
|
||||
int getNumberOfImplicitArguments() {
|
||||
exists(Ruby::Method encl |
|
||||
encl = this.getEnclosingMethod() and
|
||||
result = count(getParameter(encl, _, _))
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the local variable defined by parameter `param` which is used as an
|
||||
* implicit argument at position `pos`.
|
||||
*
|
||||
* For example, in
|
||||
*
|
||||
* ```ruby
|
||||
* class Sup
|
||||
* def m(x)
|
||||
* end
|
||||
* end
|
||||
*
|
||||
* class Sub < Sup
|
||||
* def m(x)
|
||||
* super
|
||||
* end
|
||||
* end
|
||||
* ```
|
||||
*
|
||||
* `x` is an implicit argument at position 0 of the `super` call in `Sub#m`.
|
||||
*/
|
||||
pragma[nomagic]
|
||||
LocalVariableReal getImplicitArgument(int pos, Ruby::AstNode param) {
|
||||
exists(Ruby::Method encl |
|
||||
encl = this.getEnclosingMethod() and
|
||||
toGenerated(result.getDefiningAccessImpl()) = getParameter(encl, pos, param)
|
||||
)
|
||||
}
|
||||
|
||||
final override string getMethodNameImpl() { result = getSuperMethodName(g) }
|
||||
|
||||
final override Expr getReceiverImpl() { none() }
|
||||
|
||||
final override Expr getArgumentImpl(int n) { none() }
|
||||
final override Expr getArgumentImpl(int n) { synthChild(this, n, result) }
|
||||
|
||||
final override int getNumberOfArgumentsImpl() { result = 0 }
|
||||
final override int getNumberOfArgumentsImpl() { result = this.getNumberOfImplicitArguments() }
|
||||
|
||||
final override Block getBlockImpl() { none() }
|
||||
}
|
||||
|
||||
@@ -120,3 +120,38 @@ class LeftAssignmentListImpl extends DestructuredLhsExprImpl, Ruby::LeftAssignme
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
abstract class PairImpl extends Expr, TPair {
|
||||
abstract Expr getKey();
|
||||
|
||||
abstract Expr getValue();
|
||||
|
||||
final override string toString() { result = "Pair" }
|
||||
|
||||
final override AstNode getAChild(string pred) {
|
||||
result = super.getAChild(pred)
|
||||
or
|
||||
pred = "getKey" and result = this.getKey()
|
||||
or
|
||||
pred = "getValue" and result = this.getValue()
|
||||
}
|
||||
}
|
||||
|
||||
class PairReal extends PairImpl, TPairReal {
|
||||
private Ruby::Pair g;
|
||||
|
||||
PairReal() { this = TPairReal(g) }
|
||||
|
||||
final override Expr getKey() { toGenerated(result) = g.getKey() }
|
||||
|
||||
final override Expr getValue() {
|
||||
toGenerated(result) = g.getValue() or
|
||||
synthChild(this, 0, result)
|
||||
}
|
||||
}
|
||||
|
||||
class PairSynth extends PairImpl, TPairSynth {
|
||||
final override Expr getKey() { synthChild(this, 0, result) }
|
||||
|
||||
final override Expr getValue() { synthChild(this, 1, result) }
|
||||
}
|
||||
|
||||
@@ -608,16 +608,32 @@ class BareStringLiteral extends StringLiteralImpl, TBareStringLiteral {
|
||||
|
||||
abstract class SymbolLiteralImpl extends StringlikeLiteralImpl, TSymbolLiteral { }
|
||||
|
||||
class SimpleSymbolLiteral extends SymbolLiteralImpl, TSimpleSymbolLiteral {
|
||||
abstract class SimpleSymbolLiteralImpl extends SymbolLiteralImpl, TSimpleSymbolLiteral { }
|
||||
|
||||
class SimpleSymbolLiteralReal extends SimpleSymbolLiteralImpl, TSimpleSymbolLiteral {
|
||||
private Ruby::SimpleSymbol g;
|
||||
|
||||
SimpleSymbolLiteral() { this = TSimpleSymbolLiteral(g) }
|
||||
SimpleSymbolLiteralReal() { this = TSimpleSymbolLiteralReal(g) }
|
||||
|
||||
final override StringComponent getComponentImpl(int n) { n = 0 and toGenerated(result) = g }
|
||||
|
||||
final override string toString() { result = g.getValue() }
|
||||
}
|
||||
|
||||
class SimpleSymbolLiteralSynth extends SimpleSymbolLiteralImpl, TSimpleSymbolLiteralSynth,
|
||||
StringComponentImpl
|
||||
{
|
||||
private string value;
|
||||
|
||||
SimpleSymbolLiteralSynth() { this = TSimpleSymbolLiteralSynth(_, _, value) }
|
||||
|
||||
final override string getValue() { result = value }
|
||||
|
||||
final override StringComponent getComponentImpl(int n) { n = 0 and result = this }
|
||||
|
||||
final override string toString() { result = value }
|
||||
}
|
||||
|
||||
abstract class ComplexSymbolLiteral extends SymbolLiteralImpl, TComplexSymbolLiteral { }
|
||||
|
||||
class DelimitedSymbolLiteral extends ComplexSymbolLiteral, TDelimitedSymbolLiteral {
|
||||
|
||||
@@ -45,36 +45,42 @@ class NotExprSynth extends NotExprImpl, TNotExprSynth {
|
||||
final override Expr getOperandImpl() { synthChild(this, 0, result) }
|
||||
}
|
||||
|
||||
class SplatExprReal extends UnaryOperationImpl, TSplatExprReal {
|
||||
abstract class SplatExprImpl extends UnaryOperationImpl, TSplatExpr {
|
||||
final override string getOperatorImpl() { result = "*" }
|
||||
}
|
||||
|
||||
class SplatExprReal extends SplatExprImpl, TSplatExprReal {
|
||||
private Ruby::SplatArgument g;
|
||||
|
||||
SplatExprReal() { this = TSplatExprReal(g) }
|
||||
|
||||
final override string getOperatorImpl() { result = "*" }
|
||||
|
||||
final override Expr getOperandImpl() {
|
||||
toGenerated(result) = g.getChild() or
|
||||
synthChild(this, 0, result)
|
||||
}
|
||||
}
|
||||
|
||||
class SplatExprSynth extends UnaryOperationImpl, TSplatExprSynth {
|
||||
final override string getOperatorImpl() { result = "*" }
|
||||
|
||||
class SplatExprSynth extends SplatExprImpl, TSplatExprSynth {
|
||||
final override Expr getOperandImpl() { synthChild(this, 0, result) }
|
||||
}
|
||||
|
||||
class HashSplatExprImpl extends UnaryOperationImpl, THashSplatExpr {
|
||||
abstract class HashSplatExprImpl extends UnaryOperationImpl, THashSplatExpr {
|
||||
final override string getOperatorImpl() { result = "**" }
|
||||
}
|
||||
|
||||
class HashSplatExprReal extends HashSplatExprImpl, THashSplatExprReal {
|
||||
private Ruby::HashSplatArgument g;
|
||||
|
||||
HashSplatExprImpl() { this = THashSplatExpr(g) }
|
||||
HashSplatExprReal() { this = THashSplatExprReal(g) }
|
||||
|
||||
final override Expr getOperandImpl() {
|
||||
toGenerated(result) = g.getChild() or
|
||||
synthChild(this, 0, result)
|
||||
}
|
||||
}
|
||||
|
||||
final override string getOperatorImpl() { result = "**" }
|
||||
class HashSplatExprSynth extends HashSplatExprImpl, THashSplatExprSynth {
|
||||
final override Expr getOperandImpl() { synthChild(this, 0, result) }
|
||||
}
|
||||
|
||||
abstract class DefinedExprImpl extends UnaryOperationImpl, TDefinedExpr { }
|
||||
|
||||
@@ -11,7 +11,7 @@ private import codeql.ruby.ast.internal.Scope
|
||||
private import codeql.ruby.AST
|
||||
|
||||
/** A synthesized AST node kind. */
|
||||
newtype SynthKind =
|
||||
newtype TSynthKind =
|
||||
AddExprKind() or
|
||||
AssignExprKind() or
|
||||
BitwiseAndExprKind() or
|
||||
@@ -42,16 +42,107 @@ newtype SynthKind =
|
||||
MulExprKind() or
|
||||
NilLiteralKind() or
|
||||
NotExprKind() or
|
||||
PairExprKind() or
|
||||
RangeLiteralKind(boolean inclusive) { inclusive in [false, true] } or
|
||||
RShiftExprKind() or
|
||||
SimpleParameterKind() or
|
||||
SplatExprKind() or
|
||||
HashSplatExprKind() or
|
||||
SymbolLiteralExprKind(string value) {
|
||||
value = any(Ruby::SimpleSymbol s).getValue()
|
||||
or
|
||||
value = any(Ruby::KeywordParameter p).getName().getValue()
|
||||
} or
|
||||
StmtSequenceKind() or
|
||||
SelfKind(SelfVariable v) or
|
||||
SubExprKind() or
|
||||
ConstantReadAccessKind(string value) { any(Synthesis s).constantReadAccess(value) } or
|
||||
ConstantWriteAccessKind(string value) { any(Synthesis s).constantWriteAccess(value) }
|
||||
|
||||
class SynthKind extends TSynthKind {
|
||||
string toString() {
|
||||
this = AddExprKind() and result = "AddExprKind"
|
||||
or
|
||||
this = AssignExprKind() and result = "AssignExprKind"
|
||||
or
|
||||
this = BitwiseAndExprKind() and result = "BitwiseAndExprKind"
|
||||
or
|
||||
this = BitwiseOrExprKind() and result = "BitwiseOrExprKind"
|
||||
or
|
||||
this = BitwiseXorExprKind() and result = "BitwiseXorExprKind"
|
||||
or
|
||||
this = BooleanLiteralKind(_) and result = "BooleanLiteralKind"
|
||||
or
|
||||
this = BraceBlockKind() and result = "BraceBlockKind"
|
||||
or
|
||||
this = CaseMatchKind() and result = "CaseMatchKind"
|
||||
or
|
||||
this = ClassVariableAccessKind(_) and result = "ClassVariableAccessKind"
|
||||
or
|
||||
this = DefinedExprKind() and result = "DefinedExprKind"
|
||||
or
|
||||
this = DivExprKind() and result = "DivExprKind"
|
||||
or
|
||||
this = ElseKind() and result = "ElseKind"
|
||||
or
|
||||
this = ExponentExprKind() and result = "ExponentExprKind"
|
||||
or
|
||||
this = GlobalVariableAccessKind(_) and result = "GlobalVariableAccessKind"
|
||||
or
|
||||
this = IfKind() and result = "IfKind"
|
||||
or
|
||||
this = InClauseKind() and result = "InClauseKind"
|
||||
or
|
||||
this = InstanceVariableAccessKind(_) and result = "InstanceVariableAccessKind"
|
||||
or
|
||||
this = IntegerLiteralKind(_) and result = "IntegerLiteralKind"
|
||||
or
|
||||
this = LShiftExprKind() and result = "LShiftExprKind"
|
||||
or
|
||||
this = LocalVariableAccessRealKind(_) and result = "LocalVariableAccessRealKind"
|
||||
or
|
||||
this = LocalVariableAccessSynthKind(_) and result = "LocalVariableAccessSynthKind"
|
||||
or
|
||||
this = LogicalAndExprKind() and result = "LogicalAndExprKind"
|
||||
or
|
||||
this = LogicalOrExprKind() and result = "LogicalOrExprKind"
|
||||
or
|
||||
this = MethodCallKind(_, _, _) and result = "MethodCallKind"
|
||||
or
|
||||
this = ModuloExprKind() and result = "ModuloExprKind"
|
||||
or
|
||||
this = MulExprKind() and result = "MulExprKind"
|
||||
or
|
||||
this = NilLiteralKind() and result = "NilLiteralKind"
|
||||
or
|
||||
this = NotExprKind() and result = "NotExprKind"
|
||||
or
|
||||
this = PairExprKind() and result = "PairExprKind"
|
||||
or
|
||||
this = RangeLiteralKind(_) and result = "RangeLiteralKind"
|
||||
or
|
||||
this = RShiftExprKind() and result = "RShiftExprKind"
|
||||
or
|
||||
this = SimpleParameterKind() and result = "SimpleParameterKind"
|
||||
or
|
||||
this = SplatExprKind() and result = "SplatExprKind"
|
||||
or
|
||||
this = HashSplatExprKind() and result = "HashSplatExprKind"
|
||||
or
|
||||
this = SymbolLiteralExprKind(_) and result = "SymbolLiteralExprKind"
|
||||
or
|
||||
this = StmtSequenceKind() and result = "StmtSequenceKind"
|
||||
or
|
||||
this = SubExprKind() and result = "SubExprKind"
|
||||
or
|
||||
this = SelfKind(_) and result = "SelfKind"
|
||||
or
|
||||
this = ConstantReadAccessKind(_) and result = "ConstantReadAccessKind"
|
||||
or
|
||||
this = ConstantWriteAccessKind(_) and result = "ConstantWriteAccessKind"
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* An AST child.
|
||||
*
|
||||
@@ -441,7 +532,7 @@ private module AssignOperationDesugar {
|
||||
pragma[nomagic]
|
||||
SynthKind getVariableAccessKind() {
|
||||
result in [
|
||||
LocalVariableAccessRealKind(v).(SynthKind), InstanceVariableAccessKind(v),
|
||||
LocalVariableAccessRealKind(v).(TSynthKind), InstanceVariableAccessKind(v),
|
||||
ClassVariableAccessKind(v), GlobalVariableAccessKind(v)
|
||||
]
|
||||
}
|
||||
@@ -1802,3 +1893,59 @@ private module MatchPatternDesugar {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private module ImplicitSuperArgsSynthesis {
|
||||
pragma[nomagic]
|
||||
private predicate superCallSynthesis(AstNode parent, int i, Child child) {
|
||||
exists(TokenSuperCall call, SynthChild access, int pos, Ruby::AstNode param |
|
||||
access = SynthChild(LocalVariableAccessRealKind(call.getImplicitArgument(pos, param)))
|
||||
|
|
||||
parent = call and
|
||||
param instanceof Ruby::Identifier and
|
||||
i = pos and
|
||||
child = access
|
||||
or
|
||||
param instanceof Ruby::SplatParameter and
|
||||
(
|
||||
parent = call and
|
||||
i = pos and
|
||||
child = SynthChild(SplatExprKind())
|
||||
or
|
||||
parent = TSplatExprSynth(call, pos) and
|
||||
i = 0 and
|
||||
child = access
|
||||
)
|
||||
or
|
||||
param instanceof Ruby::HashSplatParameter and
|
||||
(
|
||||
parent = call and
|
||||
i = pos and
|
||||
child = SynthChild(HashSplatExprKind())
|
||||
or
|
||||
parent = THashSplatExprSynth(call, pos) and
|
||||
i = 0 and
|
||||
child = access
|
||||
)
|
||||
or
|
||||
exists(string name | name = param.(Ruby::KeywordParameter).getName().getValue() |
|
||||
parent = call and
|
||||
i = pos and
|
||||
child = SynthChild(PairExprKind())
|
||||
or
|
||||
parent = TPairSynth(call, pos) and
|
||||
i = 0 and
|
||||
child = SynthChild(SymbolLiteralExprKind(name))
|
||||
or
|
||||
parent = TPairSynth(call, pos) and
|
||||
i = 1 and
|
||||
child = access
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private class SuperCallSynthesis extends Synthesis {
|
||||
final override predicate child(AstNode parent, int i, Child child) {
|
||||
superCallSynthesis(parent, i, child)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,11 +49,11 @@ predicate implicitAssignmentNode(Ruby::AstNode n) {
|
||||
}
|
||||
|
||||
/** Holds if `n` is inside a parameter. */
|
||||
predicate implicitParameterAssignmentNode(Ruby::AstNode n, Callable::Range c) {
|
||||
n = c.getParameter(_) or
|
||||
n = c.(Ruby::Block).getParameters().getLocals(_) or
|
||||
n = c.(Ruby::DoBlock).getParameters().getLocals(_) or
|
||||
implicitParameterAssignmentNode(n.getParent().(Ruby::DestructuredParameter), c)
|
||||
predicate implicitParameterAssignmentNode(Ruby::AstNode n, Callable::Range c, int pos) {
|
||||
n = c.getParameter(pos) or
|
||||
n = c.(Ruby::Block).getParameters().getLocals(pos) or
|
||||
n = c.(Ruby::DoBlock).getParameters().getLocals(pos) or
|
||||
implicitParameterAssignmentNode(n.getParent().(Ruby::DestructuredParameter), c, pos)
|
||||
}
|
||||
|
||||
private predicate instanceVariableAccess(
|
||||
@@ -77,26 +77,29 @@ private ModuleBase::Range enclosingModuleOrClass(Ruby::AstNode node) {
|
||||
exists(Scope::Range s | scopeOf(node) = s and result = s.getEnclosingModule())
|
||||
}
|
||||
|
||||
private predicate parameterAssignment(Callable::Range scope, string name, Ruby::Identifier i) {
|
||||
implicitParameterAssignmentNode(i, scope) and
|
||||
private predicate parameterAssignment(
|
||||
Callable::Range scope, string name, Ruby::Identifier i, int pos
|
||||
) {
|
||||
implicitParameterAssignmentNode(i, scope, pos) and
|
||||
name = i.getValue()
|
||||
}
|
||||
|
||||
/** Holds if `scope` defines `name` in its parameter declaration at `i`. */
|
||||
private predicate scopeDefinesParameterVariable(
|
||||
Callable::Range scope, string name, Ruby::Identifier i
|
||||
predicate scopeDefinesParameterVariable(
|
||||
Callable::Range scope, string name, Ruby::Identifier i, int pos
|
||||
) {
|
||||
// In case of overlapping parameter names (e.g. `_`), only the first
|
||||
// parameter will give rise to a variable
|
||||
i =
|
||||
min(Ruby::Identifier other |
|
||||
parameterAssignment(scope, name, other)
|
||||
parameterAssignment(scope, name, other, _)
|
||||
|
|
||||
other order by other.getLocation().getStartLine(), other.getLocation().getStartColumn()
|
||||
)
|
||||
) and
|
||||
parameterAssignment(scope, name, _, pos)
|
||||
or
|
||||
exists(Parameter::Range p |
|
||||
p = scope.getParameter(_) and
|
||||
p = scope.getParameter(pos) and
|
||||
name = i.getValue()
|
||||
|
|
||||
i = p.(Ruby::BlockParameter).getName() or
|
||||
@@ -153,7 +156,7 @@ private module Cached {
|
||||
)
|
||||
} or
|
||||
TLocalVariableReal(Scope::Range scope, string name, Ruby::AstNode i) {
|
||||
scopeDefinesParameterVariable(scope, name, i)
|
||||
scopeDefinesParameterVariable(scope, name, i, _)
|
||||
or
|
||||
i =
|
||||
min(Ruby::AstNode other |
|
||||
@@ -161,7 +164,7 @@ private module Cached {
|
||||
|
|
||||
other order by other.getLocation().getStartLine(), other.getLocation().getStartColumn()
|
||||
) and
|
||||
not scopeDefinesParameterVariable(scope, name, _) and
|
||||
not scopeDefinesParameterVariable(scope, name, _, _) and
|
||||
not inherits(scope, name, _)
|
||||
} or
|
||||
TSelfVariable(SelfBase::Range scope) or
|
||||
@@ -330,8 +333,8 @@ private module Cached {
|
||||
not access.getLocation().strictlyBefore(variable.getLocationImpl()) and
|
||||
// In case of overlapping parameter names, later parameters should not
|
||||
// be considered accesses to the first parameter
|
||||
if parameterAssignment(_, _, access)
|
||||
then scopeDefinesParameterVariable(_, _, access)
|
||||
if parameterAssignment(_, _, access, _)
|
||||
then scopeDefinesParameterVariable(_, _, access, _)
|
||||
else any()
|
||||
or
|
||||
exists(Scope::Range declScope |
|
||||
@@ -360,7 +363,7 @@ private module Cached {
|
||||
predicate implicitWriteAccess(Access access) {
|
||||
implicitAssignmentNode(access)
|
||||
or
|
||||
scopeDefinesParameterVariable(_, _, access)
|
||||
scopeDefinesParameterVariable(_, _, access, _)
|
||||
}
|
||||
|
||||
cached
|
||||
@@ -399,11 +402,11 @@ private predicate inherits(Scope::Range scope, string name, Scope::Range outer)
|
||||
scope instanceof Ruby::DoBlock or
|
||||
scope instanceof Ruby::Lambda
|
||||
) and
|
||||
not scopeDefinesParameterVariable(scope, name, _) and
|
||||
not scopeDefinesParameterVariable(scope, name, _, _) and
|
||||
(
|
||||
outer = scope.getOuterScope() and
|
||||
(
|
||||
scopeDefinesParameterVariable(outer, name, _)
|
||||
scopeDefinesParameterVariable(outer, name, _, _)
|
||||
or
|
||||
exists(Ruby::AstNode i |
|
||||
scopeAssigns(outer, name, i) and
|
||||
|
||||
@@ -1430,7 +1430,10 @@ module Trees {
|
||||
}
|
||||
|
||||
private class StringlikeLiteralTree extends StandardPostOrderTree instanceof StringlikeLiteral {
|
||||
StringlikeLiteralTree() { not this instanceof HereDoc }
|
||||
StringlikeLiteralTree() {
|
||||
not this instanceof HereDoc and
|
||||
not this instanceof AstInternal::TSimpleSymbolLiteralSynth
|
||||
}
|
||||
|
||||
final override ControlFlowTree getChildNode(int i) { result = super.getComponent(i) }
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
private import codeql.util.Boolean
|
||||
private import codeql.util.Unit
|
||||
private import codeql.ruby.AST
|
||||
private import codeql.ruby.ast.internal.Call
|
||||
private import codeql.ruby.ast.internal.Synthesis
|
||||
private import codeql.ruby.CFG
|
||||
private import codeql.ruby.dataflow.SSA
|
||||
@@ -483,9 +484,12 @@ private module Cached {
|
||||
TSelfToplevelParameterNode(Toplevel t) or
|
||||
TLambdaSelfReferenceNode(Callable c) { lambdaCreationExpr(_, _, c) } or
|
||||
TImplicitBlockParameterNode(MethodBase m) { not m.getAParameter() instanceof BlockParameter } or
|
||||
TImplicitBlockArgumentNode(CfgNodes::ExprNodes::CallCfgNode yield) {
|
||||
TImplicitYieldBlockArgumentNode(CfgNodes::ExprNodes::CallCfgNode yield) {
|
||||
yield = any(BlockParameterNode b).getAYieldCall()
|
||||
} or
|
||||
TImplicitSuperBlockArgumentNode(CfgNodes::ExprNodes::CallCfgNode sup) {
|
||||
sup = any(BlockParameterNode b).getASuperCall()
|
||||
} or
|
||||
TSynthHashSplatParameterNode(DataFlowCallable c) {
|
||||
isParameterNode(_, c, any(ParameterPosition p | p.isKeyword(_)))
|
||||
} or
|
||||
@@ -1049,6 +1053,11 @@ private module ParameterNodes {
|
||||
CfgNodes::ExprNodes::CallCfgNode getAYieldCall() {
|
||||
this.getMethod() = result.getExpr().(YieldCall).getEnclosingMethod()
|
||||
}
|
||||
|
||||
CfgNodes::ExprNodes::CallCfgNode getASuperCall() {
|
||||
this.getMethod() = result.getExpr().getEnclosingMethod() and
|
||||
result.getExpr() instanceof TokenSuperCall
|
||||
}
|
||||
}
|
||||
|
||||
private class ExplicitBlockParameterNode extends BlockParameterNode, NormalParameterNode {
|
||||
@@ -1315,15 +1324,23 @@ module ArgumentNodes {
|
||||
}
|
||||
}
|
||||
|
||||
class ImplicitBlockArgumentNode extends NodeImpl, ArgumentNode, TImplicitBlockArgumentNode {
|
||||
abstract class ImplicitBlockArgumentNode extends NodeImpl, ArgumentNode {
|
||||
pragma[nomagic]
|
||||
abstract BlockParameterNode getParameterNode(boolean inSameScope);
|
||||
|
||||
override string toStringImpl() { result = "yield block argument" }
|
||||
}
|
||||
|
||||
class ImplicitYieldBlockArgumentNode extends ImplicitBlockArgumentNode,
|
||||
TImplicitYieldBlockArgumentNode
|
||||
{
|
||||
CfgNodes::ExprNodes::CallCfgNode yield;
|
||||
|
||||
ImplicitBlockArgumentNode() { this = TImplicitBlockArgumentNode(yield) }
|
||||
ImplicitYieldBlockArgumentNode() { this = TImplicitYieldBlockArgumentNode(yield) }
|
||||
|
||||
CfgNodes::ExprNodes::CallCfgNode getYieldCall() { result = yield }
|
||||
|
||||
pragma[nomagic]
|
||||
BlockParameterNode getParameterNode(boolean inSameScope) {
|
||||
override BlockParameterNode getParameterNode(boolean inSameScope) {
|
||||
result.getAYieldCall() = yield and
|
||||
if nodeGetEnclosingCallable(this) = nodeGetEnclosingCallable(result)
|
||||
then inSameScope = true
|
||||
@@ -1343,8 +1360,36 @@ module ArgumentNodes {
|
||||
override CfgScope getCfgScope() { result = yield.getScope() }
|
||||
|
||||
override Location getLocationImpl() { result = yield.getLocation() }
|
||||
}
|
||||
|
||||
override string toStringImpl() { result = "yield block argument" }
|
||||
class ImplicitSuperBlockArgumentNode extends ImplicitBlockArgumentNode,
|
||||
TImplicitSuperBlockArgumentNode
|
||||
{
|
||||
CfgNodes::ExprNodes::CallCfgNode sup;
|
||||
|
||||
ImplicitSuperBlockArgumentNode() { this = TImplicitSuperBlockArgumentNode(sup) }
|
||||
|
||||
CfgNodes::ExprNodes::CallCfgNode getSuperCall() { result = sup }
|
||||
|
||||
override BlockParameterNode getParameterNode(boolean inSameScope) {
|
||||
result.getASuperCall() = sup and
|
||||
if nodeGetEnclosingCallable(this) = nodeGetEnclosingCallable(result)
|
||||
then inSameScope = true
|
||||
else inSameScope = false
|
||||
}
|
||||
|
||||
override predicate sourceArgumentOf(CfgNodes::ExprNodes::CallCfgNode call, ArgumentPosition pos) {
|
||||
call = sup and
|
||||
pos.isBlock()
|
||||
}
|
||||
|
||||
override predicate argumentOf(DataFlowCall call, ArgumentPosition pos) {
|
||||
this.sourceArgumentOf(call.asCall(), pos)
|
||||
}
|
||||
|
||||
override CfgScope getCfgScope() { result = sup.getScope() }
|
||||
|
||||
override Location getLocationImpl() { result = sup.getLocation() }
|
||||
}
|
||||
|
||||
private class SummaryArgumentNode extends FlowSummaryNode, ArgumentNode {
|
||||
@@ -2158,7 +2203,7 @@ private predicate lambdaCallExpr(
|
||||
*/
|
||||
predicate lambdaSourceCall(CfgNodes::ExprNodes::CallCfgNode call, LambdaCallKind kind, Node receiver) {
|
||||
kind = TYieldCallKind() and
|
||||
call = receiver.(ImplicitBlockArgumentNode).getYieldCall()
|
||||
call = receiver.(ImplicitYieldBlockArgumentNode).getYieldCall()
|
||||
or
|
||||
kind = TLambdaCallKind() and
|
||||
lambdaCallExpr(call, receiver.asExpr())
|
||||
|
||||
4
ruby/ql/src/change-notes/2025-04-04-refine-deadstore.md
Normal file
4
ruby/ql/src/change-notes/2025-04-04-refine-deadstore.md
Normal file
@@ -0,0 +1,4 @@
|
||||
---
|
||||
category: majorAnalysis
|
||||
---
|
||||
* The query `rb/useless-assignment-to-local` now comes with query help and has been tweaked to produce fewer false positives.
|
||||
@@ -1,4 +1,5 @@
|
||||
- queries: .
|
||||
- include:
|
||||
id:
|
||||
- rb/database-query-in-loop
|
||||
- rb/database-query-in-loop
|
||||
- rb/useless-assignment-to-local
|
||||
49
ruby/ql/src/queries/variables/DeadStoreOfLocal.qhelp
Normal file
49
ruby/ql/src/queries/variables/DeadStoreOfLocal.qhelp
Normal file
@@ -0,0 +1,49 @@
|
||||
<!DOCTYPE qhelp PUBLIC
|
||||
"-//Semmle//qhelp//EN"
|
||||
"qhelp.dtd">
|
||||
<qhelp>
|
||||
<overview>
|
||||
<p>
|
||||
A value is assigned to a local variable, but either that variable is never read
|
||||
later on, or its value is always overwritten before being read. This means
|
||||
that the original assignment has no effect, and could indicate a logic error or
|
||||
incomplete code.
|
||||
</p>
|
||||
|
||||
</overview>
|
||||
<recommendation>
|
||||
|
||||
<p>
|
||||
Ensure that you check the control and data flow in the method carefully.
|
||||
If a value is really not needed, consider omitting the assignment. Be careful,
|
||||
though: if the right-hand side has a side-effect (like performing a method call),
|
||||
it is important to keep this to preserve the overall behavior.
|
||||
</p>
|
||||
|
||||
</recommendation>
|
||||
<example>
|
||||
|
||||
<p>
|
||||
In the following example, the return value of the call to <code>send</code> on line 2
|
||||
is assigned to the local variable <code>result</code>, but then never used.
|
||||
</p>
|
||||
|
||||
<sample src="examples/DeadStoreOfLocal.rb" />
|
||||
|
||||
<p>
|
||||
Assuming that <code>send</code> returns a status code indicating whether the operation
|
||||
succeeded or not, the value of <code>result</code> should be checked, perhaps like this:
|
||||
</p>
|
||||
|
||||
<sample src="examples/DeadStoreOfLocalGood.rb" />
|
||||
|
||||
</example>
|
||||
<references>
|
||||
|
||||
|
||||
<li>Wikipedia: <a href="http://en.wikipedia.org/wiki/Dead_store">Dead store</a>.</li>
|
||||
|
||||
|
||||
|
||||
</references>
|
||||
</qhelp>
|
||||
@@ -7,16 +7,25 @@
|
||||
* @id rb/useless-assignment-to-local
|
||||
* @tags maintainability
|
||||
* external/cwe/cwe-563
|
||||
* @precision low
|
||||
* @precision medium
|
||||
*/
|
||||
|
||||
import codeql.ruby.AST
|
||||
import codeql.ruby.dataflow.SSA
|
||||
import codeql.ruby.ApiGraphs
|
||||
|
||||
class RelevantLocalVariableWriteAccess extends LocalVariableWriteAccess {
|
||||
RelevantLocalVariableWriteAccess() {
|
||||
not this.getVariable().getName().charAt(0) = "_" and
|
||||
not this = any(Parameter p).getAVariable().getDefiningAccess()
|
||||
not this = any(Parameter p).getAVariable().getDefiningAccess() and
|
||||
not API::getTopLevelMember("ERB").getInstance().getAMethodCall("result").asExpr().getScope() =
|
||||
this.getCfgScope() and
|
||||
not exists(RetryStmt r | r.getCfgScope() = this.getCfgScope()) and
|
||||
not exists(MethodCall c |
|
||||
c.getReceiver() instanceof SelfVariableAccess and
|
||||
c.getMethodName() = "binding" and
|
||||
c.getCfgScope() = this.getCfgScope()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
def f(x)
|
||||
result = send(x)
|
||||
waitForResponse
|
||||
return getResponse
|
||||
end
|
||||
@@ -0,0 +1,9 @@
|
||||
def f(x)
|
||||
result = send(x)
|
||||
# check for error
|
||||
if (result == -1)
|
||||
raise "Unable to send, check network."
|
||||
end
|
||||
waitForResponse
|
||||
return getResponse
|
||||
end
|
||||
@@ -3153,6 +3153,54 @@ params/params.rb:
|
||||
# 95| getReceiver: [LocalVariableAccess] hash
|
||||
# 95| getArgument: [HashSplatExpr] ** ...
|
||||
# 95| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] __synth__0
|
||||
# 98| getStmt: [ClassDeclaration] Sup
|
||||
# 99| getStmt: [Method] m
|
||||
# 99| getParameter: [SimpleParameter] x
|
||||
# 99| getDefiningAccess: [LocalVariableAccess] x
|
||||
# 99| getParameter: [SplatParameter] *rest
|
||||
# 99| getDefiningAccess: [LocalVariableAccess] rest
|
||||
# 99| getParameter: [KeywordParameter] k
|
||||
# 99| getDefiningAccess: [LocalVariableAccess] k
|
||||
# 99| getParameter: [HashSplatParameter] **kwargs
|
||||
# 99| getDefiningAccess: [LocalVariableAccess] kwargs
|
||||
# 100| getStmt: [MethodCall] call to print
|
||||
# 100| getReceiver: [SelfVariableAccess] self
|
||||
# 100| getArgument: [AddExpr] ... + ...
|
||||
# 100| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] x
|
||||
# 100| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 1
|
||||
# 101| getStmt: [MethodCall] call to print
|
||||
# 101| getReceiver: [SelfVariableAccess] self
|
||||
# 101| getArgument: [AddExpr] ... + ...
|
||||
# 101| getAnOperand/getLeftOperand/getReceiver: [LocalVariableAccess] k
|
||||
# 101| getAnOperand/getArgument/getRightOperand: [IntegerLiteral] 1
|
||||
# 105| getStmt: [ClassDeclaration] Sub
|
||||
# 105| getSuperclassExpr: [ConstantReadAccess] Sup
|
||||
# 106| getStmt: [Method] m
|
||||
# 106| getParameter: [SimpleParameter] y
|
||||
# 106| getDefiningAccess: [LocalVariableAccess] y
|
||||
# 106| getParameter: [SplatParameter] *rest
|
||||
# 106| getDefiningAccess: [LocalVariableAccess] rest
|
||||
# 106| getParameter: [KeywordParameter] k
|
||||
# 106| getDefiningAccess: [LocalVariableAccess] k
|
||||
# 106| getParameter: [HashSplatParameter] **kwargs
|
||||
# 106| getDefiningAccess: [LocalVariableAccess] kwargs
|
||||
# 107| getStmt: [SuperCall] super call to m
|
||||
# 107| getArgument: [HashSplatExpr] ** ...
|
||||
# 107| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] kwargs
|
||||
# 107| getArgument: [Pair] Pair
|
||||
# 107| getKey: [SymbolLiteral] k
|
||||
# 107| getValue: [LocalVariableAccess] k
|
||||
# 107| getArgument: [SplatExpr] * ...
|
||||
# 107| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] rest
|
||||
# 107| getArgument: [LocalVariableAccess] y
|
||||
# 111| getStmt: [MethodCall] call to m
|
||||
# 111| getReceiver: [MethodCall] call to new
|
||||
# 111| getReceiver: [ConstantReadAccess] Sub
|
||||
# 111| getArgument: [IntegerLiteral] 42
|
||||
# 111| getArgument: [Pair] Pair
|
||||
# 111| getKey: [SymbolLiteral] :k
|
||||
# 111| getComponent: [StringTextComponent] k
|
||||
# 111| getValue: [IntegerLiteral] 22
|
||||
erb/template.html.erb:
|
||||
# 19| [Toplevel] template.html.erb
|
||||
# 19| getStmt: [StringLiteral] "hello world"
|
||||
|
||||
@@ -6192,6 +6192,96 @@ params/params.rb:
|
||||
# 95| 0: [ReservedWord] **
|
||||
# 95| 2: [ReservedWord] )
|
||||
# 96| 4: [ReservedWord] end
|
||||
# 98| 25: [Class] Class
|
||||
# 98| 0: [ReservedWord] class
|
||||
# 98| 1: [Constant] Sup
|
||||
# 99| 2: [BodyStatement] BodyStatement
|
||||
# 99| 0: [Method] Method
|
||||
# 99| 0: [ReservedWord] def
|
||||
# 99| 1: [Identifier] m
|
||||
# 99| 2: [MethodParameters] MethodParameters
|
||||
# 99| 0: [ReservedWord] (
|
||||
# 99| 1: [Identifier] x
|
||||
# 99| 2: [ReservedWord] ,
|
||||
# 99| 3: [SplatParameter] SplatParameter
|
||||
# 99| 0: [ReservedWord] *
|
||||
# 99| 1: [Identifier] rest
|
||||
# 99| 4: [ReservedWord] ,
|
||||
# 99| 5: [KeywordParameter] KeywordParameter
|
||||
# 99| 0: [Identifier] k
|
||||
# 99| 1: [ReservedWord] :
|
||||
# 99| 6: [ReservedWord] ,
|
||||
# 99| 7: [HashSplatParameter] HashSplatParameter
|
||||
# 99| 0: [ReservedWord] **
|
||||
# 99| 1: [Identifier] kwargs
|
||||
# 99| 8: [ReservedWord] )
|
||||
# 100| 3: [BodyStatement] BodyStatement
|
||||
# 100| 0: [Call] Call
|
||||
# 100| 0: [Identifier] print
|
||||
# 100| 1: [ArgumentList] ArgumentList
|
||||
# 100| 0: [ReservedWord] (
|
||||
# 100| 1: [Binary] Binary
|
||||
# 100| 0: [Identifier] x
|
||||
# 100| 1: [ReservedWord] +
|
||||
# 100| 2: [Integer] 1
|
||||
# 100| 2: [ReservedWord] )
|
||||
# 101| 1: [Call] Call
|
||||
# 101| 0: [Identifier] print
|
||||
# 101| 1: [ArgumentList] ArgumentList
|
||||
# 101| 0: [ReservedWord] (
|
||||
# 101| 1: [Binary] Binary
|
||||
# 101| 0: [Identifier] k
|
||||
# 101| 1: [ReservedWord] +
|
||||
# 101| 2: [Integer] 1
|
||||
# 101| 2: [ReservedWord] )
|
||||
# 102| 4: [ReservedWord] end
|
||||
# 103| 3: [ReservedWord] end
|
||||
# 105| 26: [Class] Class
|
||||
# 105| 0: [ReservedWord] class
|
||||
# 105| 1: [Constant] Sub
|
||||
# 105| 2: [Superclass] Superclass
|
||||
# 105| 0: [ReservedWord] <
|
||||
# 105| 1: [Constant] Sup
|
||||
# 106| 3: [BodyStatement] BodyStatement
|
||||
# 106| 0: [Method] Method
|
||||
# 106| 0: [ReservedWord] def
|
||||
# 106| 1: [Identifier] m
|
||||
# 106| 2: [MethodParameters] MethodParameters
|
||||
# 106| 0: [ReservedWord] (
|
||||
# 106| 1: [Identifier] y
|
||||
# 106| 2: [ReservedWord] ,
|
||||
# 106| 3: [SplatParameter] SplatParameter
|
||||
# 106| 0: [ReservedWord] *
|
||||
# 106| 1: [Identifier] rest
|
||||
# 106| 4: [ReservedWord] ,
|
||||
# 106| 5: [KeywordParameter] KeywordParameter
|
||||
# 106| 0: [Identifier] k
|
||||
# 106| 1: [ReservedWord] :
|
||||
# 106| 6: [ReservedWord] ,
|
||||
# 106| 7: [HashSplatParameter] HashSplatParameter
|
||||
# 106| 0: [ReservedWord] **
|
||||
# 106| 1: [Identifier] kwargs
|
||||
# 106| 8: [ReservedWord] )
|
||||
# 107| 3: [BodyStatement] BodyStatement
|
||||
# 107| 0: [Super] super
|
||||
# 108| 4: [ReservedWord] end
|
||||
# 109| 4: [ReservedWord] end
|
||||
# 111| 27: [Call] Call
|
||||
# 111| 0: [Call] Call
|
||||
# 111| 0: [Constant] Sub
|
||||
# 111| 1: [ReservedWord] .
|
||||
# 111| 2: [Identifier] new
|
||||
# 111| 1: [ReservedWord] .
|
||||
# 111| 2: [Identifier] m
|
||||
# 111| 3: [ArgumentList] ArgumentList
|
||||
# 111| 0: [ReservedWord] (
|
||||
# 111| 1: [Integer] 42
|
||||
# 111| 2: [ReservedWord] ,
|
||||
# 111| 3: [Pair] Pair
|
||||
# 111| 0: [HashKeySymbol] k
|
||||
# 111| 1: [ReservedWord] :
|
||||
# 111| 2: [Integer] 22
|
||||
# 111| 4: [ReservedWord] )
|
||||
# 1| [Comment] # Tests for the different kinds and contexts of parameters.
|
||||
# 3| [Comment] # Method containing identifier parameters
|
||||
# 7| [Comment] # Block containing identifier parameters
|
||||
|
||||
@@ -941,6 +941,12 @@ exprValue
|
||||
| params/params.rb:65:41:65:42 | 99 | 99 | int |
|
||||
| params/params.rb:70:42:70:45 | 1000 | 1000 | int |
|
||||
| params/params.rb:70:52:70:53 | 20 | 20 | int |
|
||||
| params/params.rb:100:15:100:15 | 1 | 1 | int |
|
||||
| params/params.rb:101:15:101:15 | 1 | 1 | int |
|
||||
| params/params.rb:107:5:107:9 | k | :k | symbol |
|
||||
| params/params.rb:111:11:111:12 | 42 | 42 | int |
|
||||
| params/params.rb:111:15:111:15 | :k | :k | symbol |
|
||||
| params/params.rb:111:18:111:19 | 22 | 22 | int |
|
||||
exprCfgNodeValue
|
||||
| calls/calls.rb:8:1:8:3 | 123 | 123 | int |
|
||||
| calls/calls.rb:11:5:11:5 | 0 | 0 | int |
|
||||
@@ -1855,3 +1861,9 @@ exprCfgNodeValue
|
||||
| params/params.rb:65:41:65:42 | 99 | 99 | int |
|
||||
| params/params.rb:70:42:70:45 | 1000 | 1000 | int |
|
||||
| params/params.rb:70:52:70:53 | 20 | 20 | int |
|
||||
| params/params.rb:100:15:100:15 | 1 | 1 | int |
|
||||
| params/params.rb:101:15:101:15 | 1 | 1 | int |
|
||||
| params/params.rb:107:5:107:9 | k | :k | symbol |
|
||||
| params/params.rb:111:11:111:12 | 42 | 42 | int |
|
||||
| params/params.rb:111:15:111:15 | :k | :k | symbol |
|
||||
| params/params.rb:111:18:111:19 | 22 | 22 | int |
|
||||
|
||||
@@ -39,6 +39,14 @@ idParams
|
||||
| params.rb:86:14:86:14 | x | x |
|
||||
| params.rb:89:31:89:35 | array | array |
|
||||
| params.rb:94:36:94:39 | hash | hash |
|
||||
| params.rb:99:9:99:9 | x | x |
|
||||
| params.rb:99:12:99:16 | *rest | rest |
|
||||
| params.rb:99:19:99:19 | k | k |
|
||||
| params.rb:99:23:99:30 | **kwargs | kwargs |
|
||||
| params.rb:106:9:106:9 | y | y |
|
||||
| params.rb:106:12:106:16 | *rest | rest |
|
||||
| params.rb:106:19:106:19 | k | k |
|
||||
| params.rb:106:23:106:30 | **kwargs | kwargs |
|
||||
blockParams
|
||||
| params.rb:46:28:46:33 | &block | block |
|
||||
| params.rb:62:29:62:34 | &block | block |
|
||||
@@ -56,10 +64,14 @@ splatParams
|
||||
| params.rb:30:31:30:36 | *splat | splat |
|
||||
| params.rb:34:21:34:26 | *splat | splat |
|
||||
| params.rb:38:29:38:33 | *blah | blah |
|
||||
| params.rb:99:12:99:16 | *rest | rest |
|
||||
| params.rb:106:12:106:16 | *rest | rest |
|
||||
hashSplatParams
|
||||
| params.rb:30:39:30:52 | **double_splat | double_splat |
|
||||
| params.rb:34:29:34:42 | **double_splat | double_splat |
|
||||
| params.rb:38:36:38:43 | **wibble | wibble |
|
||||
| params.rb:99:23:99:30 | **kwargs | kwargs |
|
||||
| params.rb:106:23:106:30 | **kwargs | kwargs |
|
||||
keywordParams
|
||||
| params.rb:41:35:41:37 | foo | foo | (none) |
|
||||
| params.rb:41:41:41:43 | bar | bar | 7 |
|
||||
@@ -67,6 +79,8 @@ keywordParams
|
||||
| params.rb:49:33:49:34 | yy | yy | 100 |
|
||||
| params.rb:53:37:53:37 | y | y | (none) |
|
||||
| params.rb:53:41:53:41 | z | z | 3 |
|
||||
| params.rb:99:19:99:19 | k | k | (none) |
|
||||
| params.rb:106:19:106:19 | k | k | (none) |
|
||||
optionalParams
|
||||
| params.rb:58:39:58:42 | val2 | val2 | params.rb:58:46:58:46 | 0 |
|
||||
| params.rb:58:49:58:52 | val3 | val3 | params.rb:58:56:58:58 | 100 |
|
||||
@@ -97,6 +111,14 @@ paramsInMethods
|
||||
| params.rb:89:1:91:3 | anonymous_splat_parameter | 1 | params.rb:89:38:89:38 | * | SplatParameter |
|
||||
| params.rb:94:1:96:3 | anonymous_hash_splat_parameter | 0 | params.rb:94:36:94:39 | hash | SimpleParameter |
|
||||
| params.rb:94:1:96:3 | anonymous_hash_splat_parameter | 1 | params.rb:94:42:94:43 | ** | HashSplatParameter |
|
||||
| params.rb:99:3:102:5 | m | 0 | params.rb:99:9:99:9 | x | SimpleParameter |
|
||||
| params.rb:99:3:102:5 | m | 1 | params.rb:99:12:99:16 | *rest | SplatParameter |
|
||||
| params.rb:99:3:102:5 | m | 2 | params.rb:99:19:99:19 | k | KeywordParameter |
|
||||
| params.rb:99:3:102:5 | m | 3 | params.rb:99:23:99:30 | **kwargs | HashSplatParameter |
|
||||
| params.rb:106:3:108:5 | m | 0 | params.rb:106:9:106:9 | y | SimpleParameter |
|
||||
| params.rb:106:3:108:5 | m | 1 | params.rb:106:12:106:16 | *rest | SplatParameter |
|
||||
| params.rb:106:3:108:5 | m | 2 | params.rb:106:19:106:19 | k | KeywordParameter |
|
||||
| params.rb:106:3:108:5 | m | 3 | params.rb:106:23:106:30 | **kwargs | HashSplatParameter |
|
||||
paramsInBlocks
|
||||
| params.rb:9:11:11:3 | do ... end | 0 | params.rb:9:15:9:17 | key | SimpleParameter |
|
||||
| params.rb:9:11:11:3 | do ... end | 1 | params.rb:9:20:9:24 | value | SimpleParameter |
|
||||
@@ -175,3 +197,11 @@ params
|
||||
| params.rb:89:38:89:38 | * | 1 | SplatParameter |
|
||||
| params.rb:94:36:94:39 | hash | 0 | SimpleParameter |
|
||||
| params.rb:94:42:94:43 | ** | 1 | HashSplatParameter |
|
||||
| params.rb:99:9:99:9 | x | 0 | SimpleParameter |
|
||||
| params.rb:99:12:99:16 | *rest | 1 | SplatParameter |
|
||||
| params.rb:99:19:99:19 | k | 2 | KeywordParameter |
|
||||
| params.rb:99:23:99:30 | **kwargs | 3 | HashSplatParameter |
|
||||
| params.rb:106:9:106:9 | y | 0 | SimpleParameter |
|
||||
| params.rb:106:12:106:16 | *rest | 1 | SplatParameter |
|
||||
| params.rb:106:19:106:19 | k | 2 | KeywordParameter |
|
||||
| params.rb:106:23:106:30 | **kwargs | 3 | HashSplatParameter |
|
||||
|
||||
@@ -94,3 +94,18 @@ end
|
||||
def anonymous_hash_splat_parameter(hash, **)
|
||||
hash.merge(**)
|
||||
end
|
||||
|
||||
class Sup
|
||||
def m(x, *rest, k:, **kwargs)
|
||||
print(x + 1)
|
||||
print(k + 1)
|
||||
end
|
||||
end
|
||||
|
||||
class Sub < Sup
|
||||
def m(y, *rest, k:, **kwargs)
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
Sub.new.m(42, k: 22)
|
||||
File diff suppressed because it is too large
Load Diff
@@ -174,6 +174,34 @@ edges
|
||||
| params_flow.rb:192:24:192:32 | call to taint | params_flow.rb:181:28:181:29 | p2 | provenance | |
|
||||
| params_flow.rb:192:24:192:32 | call to taint | params_flow.rb:192:20:192:21 | [post] p1 : [collection] [element 0] | provenance | |
|
||||
| params_flow.rb:193:6:193:7 | p1 : [collection] [element 0] | params_flow.rb:193:6:193:10 | ...[...] | provenance | |
|
||||
| params_flow.rb:210:11:210:11 | x | params_flow.rb:211:14:211:14 | x | provenance | |
|
||||
| params_flow.rb:210:14:210:18 | *rest : [collection] [element 0] | params_flow.rb:212:14:212:17 | rest : [collection] [element 0] | provenance | |
|
||||
| params_flow.rb:210:14:210:18 | *rest : [collection] [element 2] | params_flow.rb:214:14:214:17 | rest : [collection] [element 2] | provenance | |
|
||||
| params_flow.rb:210:21:210:22 | k1 | params_flow.rb:215:14:215:15 | k1 | provenance | |
|
||||
| params_flow.rb:210:26:210:33 | **kwargs : Hash [element :k2] | params_flow.rb:216:14:216:19 | kwargs : Hash [element :k2] | provenance | |
|
||||
| params_flow.rb:212:14:212:17 | rest : [collection] [element 0] | params_flow.rb:212:14:212:20 | ...[...] | provenance | |
|
||||
| params_flow.rb:214:14:214:17 | rest : [collection] [element 2] | params_flow.rb:214:14:214:20 | ...[...] | provenance | |
|
||||
| params_flow.rb:216:14:216:19 | kwargs : Hash [element :k2] | params_flow.rb:216:14:216:24 | ...[...] | provenance | |
|
||||
| params_flow.rb:217:15:217:23 | call to taint | params_flow.rb:227:81:227:81 | x | provenance | |
|
||||
| params_flow.rb:222:11:222:11 | x | params_flow.rb:223:9:223:13 | x | provenance | |
|
||||
| params_flow.rb:222:14:222:18 | *rest : [collection] [element 0] | params_flow.rb:223:9:223:13 | rest : [collection] [element 0] | provenance | |
|
||||
| params_flow.rb:222:14:222:18 | *rest : [collection] [element 2] | params_flow.rb:223:9:223:13 | rest : [collection] [element 2] | provenance | |
|
||||
| params_flow.rb:222:21:222:22 | k1 | params_flow.rb:223:9:223:13 | k1 | provenance | |
|
||||
| params_flow.rb:222:26:222:33 | **kwargs : Hash [element :k2] | params_flow.rb:223:9:223:13 | kwargs : Hash [element :k2] | provenance | |
|
||||
| params_flow.rb:223:9:223:13 | * ... : [collection] [element 0] | params_flow.rb:210:14:210:18 | *rest : [collection] [element 0] | provenance | |
|
||||
| params_flow.rb:223:9:223:13 | * ... : [collection] [element 2] | params_flow.rb:210:14:210:18 | *rest : [collection] [element 2] | provenance | |
|
||||
| params_flow.rb:223:9:223:13 | ** ... : Hash [element :k2] | params_flow.rb:210:26:210:33 | **kwargs : Hash [element :k2] | provenance | |
|
||||
| params_flow.rb:223:9:223:13 | k1 | params_flow.rb:210:21:210:22 | k1 | provenance | |
|
||||
| params_flow.rb:223:9:223:13 | kwargs : Hash [element :k2] | params_flow.rb:223:9:223:13 | ** ... : Hash [element :k2] | provenance | |
|
||||
| params_flow.rb:223:9:223:13 | rest : [collection] [element 0] | params_flow.rb:223:9:223:13 | * ... : [collection] [element 0] | provenance | |
|
||||
| params_flow.rb:223:9:223:13 | rest : [collection] [element 2] | params_flow.rb:223:9:223:13 | * ... : [collection] [element 2] | provenance | |
|
||||
| params_flow.rb:223:9:223:13 | x | params_flow.rb:210:11:210:11 | x | provenance | |
|
||||
| params_flow.rb:227:11:227:19 | call to taint | params_flow.rb:222:11:222:11 | x | provenance | |
|
||||
| params_flow.rb:227:22:227:30 | call to taint | params_flow.rb:222:14:222:18 | *rest : [collection] [element 0] | provenance | |
|
||||
| params_flow.rb:227:36:227:44 | call to taint | params_flow.rb:222:14:222:18 | *rest : [collection] [element 2] | provenance | |
|
||||
| params_flow.rb:227:51:227:59 | call to taint | params_flow.rb:222:21:222:22 | k1 | provenance | |
|
||||
| params_flow.rb:227:66:227:74 | call to taint | params_flow.rb:222:26:222:33 | **kwargs : Hash [element :k2] | provenance | |
|
||||
| params_flow.rb:227:81:227:81 | x | params_flow.rb:228:10:228:10 | x | provenance | |
|
||||
nodes
|
||||
| params_flow.rb:9:16:9:17 | p1 | semmle.label | p1 |
|
||||
| params_flow.rb:9:20:9:21 | p2 | semmle.label | p2 |
|
||||
@@ -373,6 +401,40 @@ nodes
|
||||
| params_flow.rb:192:24:192:32 | call to taint | semmle.label | call to taint |
|
||||
| params_flow.rb:193:6:193:7 | p1 : [collection] [element 0] | semmle.label | p1 : [collection] [element 0] |
|
||||
| params_flow.rb:193:6:193:10 | ...[...] | semmle.label | ...[...] |
|
||||
| params_flow.rb:210:11:210:11 | x | semmle.label | x |
|
||||
| params_flow.rb:210:14:210:18 | *rest : [collection] [element 0] | semmle.label | *rest : [collection] [element 0] |
|
||||
| params_flow.rb:210:14:210:18 | *rest : [collection] [element 2] | semmle.label | *rest : [collection] [element 2] |
|
||||
| params_flow.rb:210:21:210:22 | k1 | semmle.label | k1 |
|
||||
| params_flow.rb:210:26:210:33 | **kwargs : Hash [element :k2] | semmle.label | **kwargs : Hash [element :k2] |
|
||||
| params_flow.rb:211:14:211:14 | x | semmle.label | x |
|
||||
| params_flow.rb:212:14:212:17 | rest : [collection] [element 0] | semmle.label | rest : [collection] [element 0] |
|
||||
| params_flow.rb:212:14:212:20 | ...[...] | semmle.label | ...[...] |
|
||||
| params_flow.rb:214:14:214:17 | rest : [collection] [element 2] | semmle.label | rest : [collection] [element 2] |
|
||||
| params_flow.rb:214:14:214:20 | ...[...] | semmle.label | ...[...] |
|
||||
| params_flow.rb:215:14:215:15 | k1 | semmle.label | k1 |
|
||||
| params_flow.rb:216:14:216:19 | kwargs : Hash [element :k2] | semmle.label | kwargs : Hash [element :k2] |
|
||||
| params_flow.rb:216:14:216:24 | ...[...] | semmle.label | ...[...] |
|
||||
| params_flow.rb:217:15:217:23 | call to taint | semmle.label | call to taint |
|
||||
| params_flow.rb:222:11:222:11 | x | semmle.label | x |
|
||||
| params_flow.rb:222:14:222:18 | *rest : [collection] [element 0] | semmle.label | *rest : [collection] [element 0] |
|
||||
| params_flow.rb:222:14:222:18 | *rest : [collection] [element 2] | semmle.label | *rest : [collection] [element 2] |
|
||||
| params_flow.rb:222:21:222:22 | k1 | semmle.label | k1 |
|
||||
| params_flow.rb:222:26:222:33 | **kwargs : Hash [element :k2] | semmle.label | **kwargs : Hash [element :k2] |
|
||||
| params_flow.rb:223:9:223:13 | * ... : [collection] [element 0] | semmle.label | * ... : [collection] [element 0] |
|
||||
| params_flow.rb:223:9:223:13 | * ... : [collection] [element 2] | semmle.label | * ... : [collection] [element 2] |
|
||||
| params_flow.rb:223:9:223:13 | ** ... : Hash [element :k2] | semmle.label | ** ... : Hash [element :k2] |
|
||||
| params_flow.rb:223:9:223:13 | k1 | semmle.label | k1 |
|
||||
| params_flow.rb:223:9:223:13 | kwargs : Hash [element :k2] | semmle.label | kwargs : Hash [element :k2] |
|
||||
| params_flow.rb:223:9:223:13 | rest : [collection] [element 0] | semmle.label | rest : [collection] [element 0] |
|
||||
| params_flow.rb:223:9:223:13 | rest : [collection] [element 2] | semmle.label | rest : [collection] [element 2] |
|
||||
| params_flow.rb:223:9:223:13 | x | semmle.label | x |
|
||||
| params_flow.rb:227:11:227:19 | call to taint | semmle.label | call to taint |
|
||||
| params_flow.rb:227:22:227:30 | call to taint | semmle.label | call to taint |
|
||||
| params_flow.rb:227:36:227:44 | call to taint | semmle.label | call to taint |
|
||||
| params_flow.rb:227:51:227:59 | call to taint | semmle.label | call to taint |
|
||||
| params_flow.rb:227:66:227:74 | call to taint | semmle.label | call to taint |
|
||||
| params_flow.rb:227:81:227:81 | x | semmle.label | x |
|
||||
| params_flow.rb:228:10:228:10 | x | semmle.label | x |
|
||||
subpaths
|
||||
| params_flow.rb:164:31:164:39 | call to taint | params_flow.rb:153:28:153:29 | p2 | params_flow.rb:153:23:153:24 | p1 [Return] : [collection] [element 0] | params_flow.rb:164:23:164:24 | [post] p1 : [collection] [element 0] |
|
||||
| params_flow.rb:192:24:192:32 | call to taint | params_flow.rb:181:28:181:29 | p2 | params_flow.rb:181:24:181:25 | p1 [Return] : [collection] [element 0] | params_flow.rb:192:20:192:21 | [post] p1 : [collection] [element 0] |
|
||||
@@ -430,3 +492,9 @@ testFailures
|
||||
| params_flow.rb:134:10:134:16 | ...[...] | params_flow.rb:137:23:137:31 | call to taint | params_flow.rb:134:10:134:16 | ...[...] | $@ | params_flow.rb:137:23:137:31 | call to taint | call to taint |
|
||||
| params_flow.rb:165:6:165:10 | ...[...] | params_flow.rb:164:31:164:39 | call to taint | params_flow.rb:165:6:165:10 | ...[...] | $@ | params_flow.rb:164:31:164:39 | call to taint | call to taint |
|
||||
| params_flow.rb:193:6:193:10 | ...[...] | params_flow.rb:192:24:192:32 | call to taint | params_flow.rb:193:6:193:10 | ...[...] | $@ | params_flow.rb:192:24:192:32 | call to taint | call to taint |
|
||||
| params_flow.rb:211:14:211:14 | x | params_flow.rb:227:11:227:19 | call to taint | params_flow.rb:211:14:211:14 | x | $@ | params_flow.rb:227:11:227:19 | call to taint | call to taint |
|
||||
| params_flow.rb:212:14:212:20 | ...[...] | params_flow.rb:227:22:227:30 | call to taint | params_flow.rb:212:14:212:20 | ...[...] | $@ | params_flow.rb:227:22:227:30 | call to taint | call to taint |
|
||||
| params_flow.rb:214:14:214:20 | ...[...] | params_flow.rb:227:36:227:44 | call to taint | params_flow.rb:214:14:214:20 | ...[...] | $@ | params_flow.rb:227:36:227:44 | call to taint | call to taint |
|
||||
| params_flow.rb:215:14:215:15 | k1 | params_flow.rb:227:51:227:59 | call to taint | params_flow.rb:215:14:215:15 | k1 | $@ | params_flow.rb:227:51:227:59 | call to taint | call to taint |
|
||||
| params_flow.rb:216:14:216:24 | ...[...] | params_flow.rb:227:66:227:74 | call to taint | params_flow.rb:216:14:216:24 | ...[...] | $@ | params_flow.rb:227:66:227:74 | call to taint | call to taint |
|
||||
| params_flow.rb:228:10:228:10 | x | params_flow.rb:217:15:217:23 | call to taint | params_flow.rb:228:10:228:10 | x | $@ | params_flow.rb:217:15:217:23 | call to taint | call to taint |
|
||||
|
||||
@@ -205,3 +205,25 @@ def foo(x, y)
|
||||
end
|
||||
|
||||
foo(*int_hash)
|
||||
|
||||
class Sup
|
||||
def m(x, *rest, k1:, **kwargs)
|
||||
sink(x) # $ hasValueFlow=81
|
||||
sink(rest[0]) # $ hasValueFlow=82
|
||||
sink(rest[1])
|
||||
sink(rest[2]) # $ hasValueFlow=83
|
||||
sink(k1) # $ hasValueFlow=84
|
||||
sink(kwargs[:k2]) # $ hasValueFlow=85
|
||||
yield taint(86)
|
||||
end
|
||||
end
|
||||
|
||||
class Sub < Sup
|
||||
def m(x, *rest, k1:, **kwargs)
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
Sub.new.m(taint(81), taint(82), 0, taint(83), k1: taint(84), k2: taint(85)) do |x|
|
||||
sink(x) # $ hasValueFlow=86
|
||||
end
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
| DeadStoreOfLocal.rb:2:5:2:5 | y | This assignment to $@ is useless, since its value is never read. | DeadStoreOfLocal.rb:2:5:2:5 | y | y |
|
||||
@@ -0,0 +1,2 @@
|
||||
query: queries/variables/DeadStoreOfLocal.ql
|
||||
postprocess: utils/test/InlineExpectationsTestQuery.ql
|
||||
@@ -0,0 +1,36 @@
|
||||
def test_basic(x)
|
||||
y = x #$ Alert
|
||||
y = x + 2
|
||||
return y
|
||||
end
|
||||
|
||||
def test_retry
|
||||
x = 0
|
||||
begin
|
||||
if x == 0
|
||||
raise "error"
|
||||
end
|
||||
rescue
|
||||
x = 2 # OK - the retry will allow a later read
|
||||
retry
|
||||
end
|
||||
return 42
|
||||
end
|
||||
|
||||
def test_binding
|
||||
x = 4 # OK - the binding collects the value of x
|
||||
return binding
|
||||
end
|
||||
|
||||
class Sup
|
||||
def m(x)
|
||||
print(x + 1)
|
||||
end
|
||||
end
|
||||
|
||||
class Sub < Sup
|
||||
def m(y)
|
||||
y = 3 # OK - the call to `super` sees the value of `y``
|
||||
super
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
require 'erb'
|
||||
|
||||
template = ERB.new <<EOF
|
||||
<%#-*- coding: Big5 -*-%>
|
||||
\_\_ENCODING\_\_ is <%= \_\_ENCODING\_\_ %>.
|
||||
x is <%= x %>.
|
||||
EOF
|
||||
x = 5 # OK - the template can see the value of x
|
||||
puts template.result
|
||||
6
rust/ql/lib/codeql/rust/frameworks/futures.model.yml
Normal file
6
rust/ql/lib/codeql/rust/frameworks/futures.model.yml
Normal file
@@ -0,0 +1,6 @@
|
||||
extensions:
|
||||
- addsTo:
|
||||
pack: codeql/rust-all
|
||||
extensible: summaryModel
|
||||
data:
|
||||
- ["repo:https://github.com/rust-lang/futures-rs:futures-executor", "crate::local_pool::block_on", "Argument[0]", "ReturnValue", "value", "manual"]
|
||||
@@ -194,21 +194,11 @@ abstract class ItemNode extends Locatable {
|
||||
this = result.(ImplOrTraitItemNode).getAnItemInSelfScope()
|
||||
or
|
||||
name = "crate" and
|
||||
result =
|
||||
any(CrateItemNode crate |
|
||||
this = crate.getASourceFile()
|
||||
or
|
||||
this = crate.getModuleNode()
|
||||
)
|
||||
this = result.(CrateItemNode).getARootModuleNode()
|
||||
or
|
||||
// todo: implement properly
|
||||
name = "$crate" and
|
||||
result =
|
||||
any(CrateItemNode crate |
|
||||
this = crate.getASourceFile()
|
||||
or
|
||||
this = crate.getModuleNode()
|
||||
).(Crate).getADependency*() and
|
||||
result = any(CrateItemNode crate | this = crate.getARootModuleNode()).(Crate).getADependency*() and
|
||||
result.(CrateItemNode).isPotentialDollarCrateTarget()
|
||||
}
|
||||
|
||||
@@ -237,7 +227,7 @@ abstract private class ModuleLikeNode extends ItemNode {
|
||||
predicate isRoot() {
|
||||
this instanceof SourceFileItemNode
|
||||
or
|
||||
this = any(CrateItemNode c).getModuleNode()
|
||||
this = any(Crate c).getModule()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -294,6 +284,15 @@ class CrateItemNode extends ItemNode instanceof Crate {
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a root module node belonging to this crate.
|
||||
*/
|
||||
ModuleLikeNode getARootModuleNode() {
|
||||
result = this.getASourceFile()
|
||||
or
|
||||
result = super.getModule()
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
predicate isPotentialDollarCrateTarget() {
|
||||
exists(string name, RelevantPath p |
|
||||
@@ -373,6 +372,8 @@ abstract class ImplOrTraitItemNode extends ItemNode {
|
||||
/** Gets an item that may refer to this node using `Self`. */
|
||||
pragma[nomagic]
|
||||
ItemNode getAnItemInSelfScope() {
|
||||
result = this
|
||||
or
|
||||
result.getImmediateParent() = this
|
||||
or
|
||||
exists(ItemNode mid |
|
||||
|
||||
@@ -53,11 +53,31 @@ class TypeReprMention extends TypeMention, TypeRepr {
|
||||
or
|
||||
result = this.(PathTypeRepr).getPath().(PathMention).resolveType()
|
||||
}
|
||||
|
||||
override Type resolveTypeAt(TypePath path) {
|
||||
result = this.(PathTypeRepr).getPath().(PathMention).resolveTypeAt(path)
|
||||
or
|
||||
not exists(this.(PathTypeRepr).getPath()) and
|
||||
result = super.resolveTypeAt(path)
|
||||
}
|
||||
}
|
||||
|
||||
class PathMention extends TypeMention, Path {
|
||||
/** Holds if `path` resolves to the type alias `alias` with the definition `rhs`. */
|
||||
private predicate resolvePathAlias(Path path, TypeAlias alias, TypeReprMention rhs) {
|
||||
alias = resolvePath(path) and rhs = alias.getTypeRepr()
|
||||
}
|
||||
|
||||
abstract class PathMention extends TypeMention, Path {
|
||||
override TypeMention getTypeArgument(int i) {
|
||||
result = this.getSegment().getGenericArgList().getTypeArg(i)
|
||||
}
|
||||
}
|
||||
|
||||
class NonAliasPathMention extends PathMention {
|
||||
NonAliasPathMention() { not resolvePathAlias(this, _, _) }
|
||||
|
||||
override TypeMention getTypeArgument(int i) {
|
||||
result = super.getTypeArgument(i)
|
||||
or
|
||||
// `Self` paths inside `impl` blocks have implicit type arguments that are
|
||||
// the type parameters of the `impl` block. For example, in
|
||||
@@ -98,6 +118,33 @@ class PathMention extends TypeMention, Path {
|
||||
}
|
||||
}
|
||||
|
||||
class AliasPathMention extends PathMention {
|
||||
TypeAlias alias;
|
||||
TypeReprMention rhs;
|
||||
|
||||
AliasPathMention() { resolvePathAlias(this, alias, rhs) }
|
||||
|
||||
/** Get the `i`th type parameter of the alias itself. */
|
||||
private TypeParameter getTypeParameter(int i) {
|
||||
result = TTypeParamTypeParameter(alias.getGenericParamList().getTypeParam(i))
|
||||
}
|
||||
|
||||
override Type resolveType() { result = rhs.resolveType() }
|
||||
|
||||
override Type resolveTypeAt(TypePath path) {
|
||||
result = rhs.resolveTypeAt(path) and
|
||||
not result = this.getTypeParameter(_)
|
||||
or
|
||||
exists(TypeParameter tp, TypeMention arg, TypePath prefix, TypePath suffix, int i |
|
||||
tp = rhs.resolveTypeAt(prefix) and
|
||||
tp = this.getTypeParameter(i) and
|
||||
arg = this.getTypeArgument(i) and
|
||||
result = arg.resolveTypeAt(suffix) and
|
||||
path = prefix.append(suffix)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// Used to represent implicit `Self` type arguments in traits and `impl` blocks,
|
||||
// see `PathMention` for details.
|
||||
class TypeParamMention extends TypeMention, TypeParam {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
models
|
||||
| 1 | Summary: repo:https://github.com/rust-lang/futures-rs:futures-executor; crate::local_pool::block_on; Argument[0]; ReturnValue; value |
|
||||
edges
|
||||
| main.rs:12:28:14:1 | { ... } | main.rs:17:13:17:23 | get_data(...) | provenance | |
|
||||
| main.rs:13:5:13:13 | source(...) | main.rs:12:28:14:1 | { ... } | provenance | |
|
||||
@@ -91,10 +92,15 @@ edges
|
||||
| main.rs:188:9:188:9 | d [MyInt] | main.rs:189:10:189:10 | d [MyInt] | provenance | |
|
||||
| main.rs:188:13:188:20 | a.add(...) [MyInt] | main.rs:188:9:188:9 | d [MyInt] | provenance | |
|
||||
| main.rs:189:10:189:10 | d [MyInt] | main.rs:189:10:189:16 | d.value | provenance | |
|
||||
| main.rs:227:32:231:1 | { ... } | main.rs:246:41:246:54 | async_source(...) | provenance | |
|
||||
| main.rs:228:9:228:9 | a | main.rs:227:32:231:1 | { ... } | provenance | |
|
||||
| main.rs:228:9:228:9 | a | main.rs:229:10:229:10 | a | provenance | |
|
||||
| main.rs:228:13:228:21 | source(...) | main.rs:228:9:228:9 | a | provenance | |
|
||||
| main.rs:238:13:238:13 | c | main.rs:239:14:239:14 | c | provenance | |
|
||||
| main.rs:238:17:238:25 | source(...) | main.rs:238:13:238:13 | c | provenance | |
|
||||
| main.rs:246:9:246:9 | a | main.rs:247:10:247:10 | a | provenance | |
|
||||
| main.rs:246:13:246:55 | ...::block_on(...) | main.rs:246:9:246:9 | a | provenance | |
|
||||
| main.rs:246:41:246:54 | async_source(...) | main.rs:246:13:246:55 | ...::block_on(...) | provenance | MaD:1 |
|
||||
nodes
|
||||
| main.rs:12:28:14:1 | { ... } | semmle.label | { ... } |
|
||||
| main.rs:13:5:13:13 | source(...) | semmle.label | source(...) |
|
||||
@@ -196,12 +202,17 @@ nodes
|
||||
| main.rs:188:13:188:20 | a.add(...) [MyInt] | semmle.label | a.add(...) [MyInt] |
|
||||
| main.rs:189:10:189:10 | d [MyInt] | semmle.label | d [MyInt] |
|
||||
| main.rs:189:10:189:16 | d.value | semmle.label | d.value |
|
||||
| main.rs:227:32:231:1 | { ... } | semmle.label | { ... } |
|
||||
| main.rs:228:9:228:9 | a | semmle.label | a |
|
||||
| main.rs:228:13:228:21 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:229:10:229:10 | a | semmle.label | a |
|
||||
| main.rs:238:13:238:13 | c | semmle.label | c |
|
||||
| main.rs:238:17:238:25 | source(...) | semmle.label | source(...) |
|
||||
| main.rs:239:14:239:14 | c | semmle.label | c |
|
||||
| main.rs:246:9:246:9 | a | semmle.label | a |
|
||||
| main.rs:246:13:246:55 | ...::block_on(...) | semmle.label | ...::block_on(...) |
|
||||
| main.rs:246:41:246:54 | async_source(...) | semmle.label | async_source(...) |
|
||||
| main.rs:247:10:247:10 | a | semmle.label | a |
|
||||
subpaths
|
||||
| main.rs:38:23:38:31 | source(...) | main.rs:26:28:26:33 | ...: i64 | main.rs:26:17:26:25 | SelfParam [Return] [&ref, MyStruct] | main.rs:38:6:38:11 | [post] &mut a [&ref, MyStruct] |
|
||||
| main.rs:39:10:39:10 | a [MyStruct] | main.rs:30:17:30:21 | SelfParam [&ref, MyStruct] | main.rs:30:31:32:5 | { ... } | main.rs:39:10:39:21 | a.get_data() |
|
||||
@@ -232,3 +243,4 @@ testFailures
|
||||
| main.rs:189:10:189:16 | d.value | main.rs:186:28:186:36 | source(...) | main.rs:189:10:189:16 | d.value | $@ | main.rs:186:28:186:36 | source(...) | source(...) |
|
||||
| main.rs:229:10:229:10 | a | main.rs:228:13:228:21 | source(...) | main.rs:229:10:229:10 | a | $@ | main.rs:228:13:228:21 | source(...) | source(...) |
|
||||
| main.rs:239:14:239:14 | c | main.rs:238:17:238:25 | source(...) | main.rs:239:14:239:14 | c | $@ | main.rs:238:17:238:25 | source(...) | source(...) |
|
||||
| main.rs:247:10:247:10 | a | main.rs:228:13:228:21 | source(...) | main.rs:247:10:247:10 | a | $@ | main.rs:228:13:228:21 | source(...) | source(...) |
|
||||
|
||||
@@ -244,7 +244,7 @@ async fn test_async_await_async_part() {
|
||||
|
||||
fn test_async_await() {
|
||||
let a = futures::executor::block_on(async_source());
|
||||
sink(a); // $ MISSING: hasValueFlow=1
|
||||
sink(a); // $ hasValueFlow=1
|
||||
|
||||
futures::executor::block_on(test_async_await_async_part());
|
||||
}
|
||||
|
||||
@@ -60,8 +60,10 @@
|
||||
| main.rs:238:17:238:25 | source(...) | main.rs:1:1:3:1 | fn source |
|
||||
| main.rs:239:9:239:15 | sink(...) | main.rs:5:1:7:1 | fn sink |
|
||||
| main.rs:242:5:242:17 | sink(...) | main.rs:5:1:7:1 | fn sink |
|
||||
| main.rs:246:13:246:55 | ...::block_on(...) | file://:0:0:0:0 | repo:https://github.com/rust-lang/futures-rs:futures-executor::_::crate::local_pool::block_on |
|
||||
| main.rs:246:41:246:54 | async_source(...) | main.rs:227:1:231:1 | fn async_source |
|
||||
| main.rs:247:5:247:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
|
||||
| main.rs:249:5:249:62 | ...::block_on(...) | file://:0:0:0:0 | repo:https://github.com/rust-lang/futures-rs:futures-executor::_::crate::local_pool::block_on |
|
||||
| main.rs:249:33:249:61 | test_async_await_async_part(...) | main.rs:233:1:243:1 | fn test_async_await_async_part |
|
||||
| main.rs:253:5:253:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call |
|
||||
| main.rs:254:5:254:35 | data_out_of_call_side_effect1(...) | main.rs:35:1:40:1 | fn data_out_of_call_side_effect1 |
|
||||
|
||||
@@ -1921,6 +1921,7 @@ models
|
||||
| 1058 | Summary: lang:std; crate::thread::current::set_current; Argument[0]; ReturnValue.Field[crate::result::Result::Err(0)]; value |
|
||||
| 1059 | Summary: lang:std; crate::thread::current::try_with_current; Argument[0].ReturnValue; ReturnValue; value |
|
||||
| 1060 | Summary: lang:std; crate::thread::with_current_name; Argument[0].ReturnValue; ReturnValue; value |
|
||||
| 1061 | Summary: repo:https://github.com/rust-lang/futures-rs:futures-executor; crate::local_pool::block_on; Argument[0]; ReturnValue; value |
|
||||
storeStep
|
||||
| file://:0:0:0:0 | [summary] to write: Argument[0].Field[crate::option::Option::Some(0)] in lang:core::_::<crate::option::Option>::zip_with | Some | file://:0:0:0:0 | [post] [summary param] 0 in lang:core::_::<crate::option::Option>::zip_with |
|
||||
| file://:0:0:0:0 | [summary] to write: Argument[0].Parameter[0].Reference in lang:alloc::_::<crate::collections::vec_deque::VecDeque>::retain | &ref | file://:0:0:0:0 | [summary] to write: Argument[0].Parameter[0] in lang:alloc::_::<crate::collections::vec_deque::VecDeque>::retain |
|
||||
|
||||
@@ -520,6 +520,33 @@ mod m21 {
|
||||
}
|
||||
}
|
||||
|
||||
mod m23 {
|
||||
#[rustfmt::skip]
|
||||
trait Trait1<
|
||||
T // I1
|
||||
> {
|
||||
fn f(&self); // I3
|
||||
} // I2
|
||||
|
||||
struct S; // I4
|
||||
|
||||
#[rustfmt::skip]
|
||||
impl Trait1<
|
||||
Self // $ item=I4
|
||||
> // $ item=I2
|
||||
for S { // $ item=I4
|
||||
fn f(&self) {
|
||||
println!("m23::<S as Trait1<S>>::f");
|
||||
} // I5
|
||||
}
|
||||
|
||||
#[rustfmt::skip]
|
||||
pub fn f() {
|
||||
let x = S; // $ item=I4
|
||||
x.f(); // $ item=I5
|
||||
} // I108
|
||||
}
|
||||
|
||||
fn main() {
|
||||
my::nested::nested1::nested2::f(); // $ item=I4
|
||||
my::f(); // $ item=I38
|
||||
@@ -547,4 +574,5 @@ fn main() {
|
||||
my3::f(); // $ item=I200
|
||||
nested_f(); // $ item=I201
|
||||
m18::m19::m20::g(); // $ item=I103
|
||||
m23::f(); // $ item=I108
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ mod
|
||||
| main.rs:496:1:521:1 | mod m21 |
|
||||
| main.rs:497:5:503:5 | mod m22 |
|
||||
| main.rs:505:5:520:5 | mod m33 |
|
||||
| main.rs:523:1:548:1 | mod m23 |
|
||||
| my2/mod.rs:1:1:1:16 | mod nested2 |
|
||||
| my2/mod.rs:12:1:12:12 | mod my3 |
|
||||
| my2/nested2.rs:1:1:11:1 | mod nested3 |
|
||||
@@ -59,7 +60,7 @@ resolvePath
|
||||
| main.rs:30:17:30:21 | super | main.rs:18:5:36:5 | mod m2 |
|
||||
| main.rs:30:17:30:24 | ...::f | main.rs:19:9:21:9 | fn f |
|
||||
| main.rs:33:17:33:17 | f | main.rs:19:9:21:9 | fn f |
|
||||
| main.rs:40:9:40:13 | super | main.rs:1:1:550:2 | SourceFile |
|
||||
| main.rs:40:9:40:13 | super | main.rs:1:1:578:2 | SourceFile |
|
||||
| main.rs:40:9:40:17 | ...::m1 | main.rs:13:1:37:1 | mod m1 |
|
||||
| main.rs:40:9:40:21 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
|
||||
| main.rs:40:9:40:24 | ...::g | main.rs:23:9:27:9 | fn g |
|
||||
@@ -71,7 +72,7 @@ resolvePath
|
||||
| main.rs:61:17:61:19 | Foo | main.rs:59:9:59:21 | struct Foo |
|
||||
| main.rs:64:13:64:15 | Foo | main.rs:53:5:53:17 | struct Foo |
|
||||
| main.rs:66:5:66:5 | f | main.rs:55:5:62:5 | fn f |
|
||||
| main.rs:68:5:68:8 | self | main.rs:1:1:550:2 | SourceFile |
|
||||
| main.rs:68:5:68:8 | self | main.rs:1:1:578:2 | SourceFile |
|
||||
| main.rs:68:5:68:11 | ...::i | main.rs:71:1:83:1 | fn i |
|
||||
| main.rs:74:13:74:15 | Foo | main.rs:48:1:48:13 | struct Foo |
|
||||
| main.rs:81:17:81:19 | Foo | main.rs:77:9:79:9 | struct Foo |
|
||||
@@ -85,7 +86,7 @@ resolvePath
|
||||
| main.rs:87:57:87:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g |
|
||||
| main.rs:87:80:87:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
|
||||
| main.rs:100:5:100:22 | f_defined_in_macro | main.rs:99:18:99:42 | fn f_defined_in_macro |
|
||||
| main.rs:117:13:117:17 | super | main.rs:1:1:550:2 | SourceFile |
|
||||
| main.rs:117:13:117:17 | super | main.rs:1:1:578:2 | SourceFile |
|
||||
| main.rs:117:13:117:21 | ...::m5 | main.rs:103:1:107:1 | mod m5 |
|
||||
| main.rs:118:9:118:9 | f | main.rs:104:5:106:5 | fn f |
|
||||
| main.rs:118:9:118:9 | f | main.rs:110:5:112:5 | fn f |
|
||||
@@ -234,61 +235,67 @@ resolvePath
|
||||
| main.rs:517:21:517:26 | MyEnum | main.rs:498:9:500:9 | enum MyEnum |
|
||||
| main.rs:517:21:517:29 | ...::A | main.rs:499:13:499:13 | A |
|
||||
| main.rs:518:21:518:28 | MyStruct | main.rs:502:9:502:28 | struct MyStruct |
|
||||
| main.rs:524:5:524:6 | my | main.rs:1:1:1:7 | mod my |
|
||||
| main.rs:524:5:524:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
|
||||
| main.rs:524:5:524:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
|
||||
| main.rs:524:5:524:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
|
||||
| main.rs:524:5:524:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
|
||||
| main.rs:525:5:525:6 | my | main.rs:1:1:1:7 | mod my |
|
||||
| main.rs:525:5:525:9 | ...::f | my.rs:5:1:7:1 | fn f |
|
||||
| main.rs:526:5:526:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
|
||||
| main.rs:526:5:526:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
|
||||
| main.rs:526:5:526:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
|
||||
| main.rs:526:5:526:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
|
||||
| main.rs:527:5:527:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
|
||||
| main.rs:528:5:528:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
|
||||
| main.rs:529:5:529:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) |
|
||||
| main.rs:529:5:529:12 | ...::h | main.rs:50:1:69:1 | fn h |
|
||||
| main.rs:530:5:530:6 | m1 | main.rs:13:1:37:1 | mod m1 |
|
||||
| main.rs:530:5:530:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
|
||||
| main.rs:530:5:530:13 | ...::g | main.rs:23:9:27:9 | fn g |
|
||||
| main.rs:531:5:531:6 | m1 | main.rs:13:1:37:1 | mod m1 |
|
||||
| main.rs:531:5:531:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
|
||||
| main.rs:531:5:531:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 |
|
||||
| main.rs:531:5:531:17 | ...::h | main.rs:30:27:34:13 | fn h |
|
||||
| main.rs:532:5:532:6 | m4 | main.rs:39:1:46:1 | mod m4 |
|
||||
| main.rs:532:5:532:9 | ...::i | main.rs:42:5:45:5 | fn i |
|
||||
| main.rs:533:5:533:5 | h | main.rs:50:1:69:1 | fn h |
|
||||
| main.rs:534:5:534:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
|
||||
| main.rs:535:5:535:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
|
||||
| main.rs:536:5:536:5 | j | main.rs:97:1:101:1 | fn j |
|
||||
| main.rs:537:5:537:6 | m6 | main.rs:109:1:120:1 | mod m6 |
|
||||
| main.rs:537:5:537:9 | ...::g | main.rs:114:5:119:5 | fn g |
|
||||
| main.rs:538:5:538:6 | m7 | main.rs:122:1:137:1 | mod m7 |
|
||||
| main.rs:538:5:538:9 | ...::f | main.rs:129:5:136:5 | fn f |
|
||||
| main.rs:539:5:539:6 | m8 | main.rs:139:1:193:1 | mod m8 |
|
||||
| main.rs:539:5:539:9 | ...::g | main.rs:177:5:192:5 | fn g |
|
||||
| main.rs:540:5:540:6 | m9 | main.rs:195:1:203:1 | mod m9 |
|
||||
| main.rs:540:5:540:9 | ...::f | main.rs:198:5:202:5 | fn f |
|
||||
| main.rs:541:5:541:7 | m11 | main.rs:226:1:263:1 | mod m11 |
|
||||
| main.rs:541:5:541:10 | ...::f | main.rs:231:5:234:5 | fn f |
|
||||
| main.rs:542:5:542:7 | m15 | main.rs:294:1:348:1 | mod m15 |
|
||||
| main.rs:542:5:542:10 | ...::f | main.rs:335:5:347:5 | fn f |
|
||||
| main.rs:543:5:543:7 | m16 | main.rs:350:1:442:1 | mod m16 |
|
||||
| main.rs:543:5:543:10 | ...::f | main.rs:417:5:441:5 | fn f |
|
||||
| main.rs:544:5:544:7 | m17 | main.rs:444:1:474:1 | mod m17 |
|
||||
| main.rs:544:5:544:10 | ...::f | main.rs:468:5:473:5 | fn f |
|
||||
| main.rs:545:5:545:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
|
||||
| main.rs:545:5:545:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
|
||||
| main.rs:546:5:546:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
|
||||
| main.rs:546:5:546:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
|
||||
| main.rs:547:5:547:7 | my3 | my2/mod.rs:12:1:12:12 | mod my3 |
|
||||
| main.rs:547:5:547:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
|
||||
| main.rs:548:5:548:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
|
||||
| main.rs:549:5:549:7 | m18 | main.rs:476:1:494:1 | mod m18 |
|
||||
| main.rs:549:5:549:12 | ...::m19 | main.rs:481:5:493:5 | mod m19 |
|
||||
| main.rs:549:5:549:17 | ...::m20 | main.rs:486:9:492:9 | mod m20 |
|
||||
| main.rs:549:5:549:20 | ...::g | main.rs:487:13:491:13 | fn g |
|
||||
| main.rs:534:10:536:5 | Trait1::<...> | main.rs:524:5:529:5 | trait Trait1 |
|
||||
| main.rs:535:7:535:10 | Self | main.rs:531:5:531:13 | struct S |
|
||||
| main.rs:537:11:537:11 | S | main.rs:531:5:531:13 | struct S |
|
||||
| main.rs:545:17:545:17 | S | main.rs:531:5:531:13 | struct S |
|
||||
| main.rs:551:5:551:6 | my | main.rs:1:1:1:7 | mod my |
|
||||
| main.rs:551:5:551:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
|
||||
| main.rs:551:5:551:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
|
||||
| main.rs:551:5:551:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
|
||||
| main.rs:551:5:551:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
|
||||
| main.rs:552:5:552:6 | my | main.rs:1:1:1:7 | mod my |
|
||||
| main.rs:552:5:552:9 | ...::f | my.rs:5:1:7:1 | fn f |
|
||||
| main.rs:553:5:553:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
|
||||
| main.rs:553:5:553:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
|
||||
| main.rs:553:5:553:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
|
||||
| main.rs:553:5:553:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
|
||||
| main.rs:554:5:554:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
|
||||
| main.rs:555:5:555:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
|
||||
| main.rs:556:5:556:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) |
|
||||
| main.rs:556:5:556:12 | ...::h | main.rs:50:1:69:1 | fn h |
|
||||
| main.rs:557:5:557:6 | m1 | main.rs:13:1:37:1 | mod m1 |
|
||||
| main.rs:557:5:557:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
|
||||
| main.rs:557:5:557:13 | ...::g | main.rs:23:9:27:9 | fn g |
|
||||
| main.rs:558:5:558:6 | m1 | main.rs:13:1:37:1 | mod m1 |
|
||||
| main.rs:558:5:558:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
|
||||
| main.rs:558:5:558:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 |
|
||||
| main.rs:558:5:558:17 | ...::h | main.rs:30:27:34:13 | fn h |
|
||||
| main.rs:559:5:559:6 | m4 | main.rs:39:1:46:1 | mod m4 |
|
||||
| main.rs:559:5:559:9 | ...::i | main.rs:42:5:45:5 | fn i |
|
||||
| main.rs:560:5:560:5 | h | main.rs:50:1:69:1 | fn h |
|
||||
| main.rs:561:5:561:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
|
||||
| main.rs:562:5:562:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
|
||||
| main.rs:563:5:563:5 | j | main.rs:97:1:101:1 | fn j |
|
||||
| main.rs:564:5:564:6 | m6 | main.rs:109:1:120:1 | mod m6 |
|
||||
| main.rs:564:5:564:9 | ...::g | main.rs:114:5:119:5 | fn g |
|
||||
| main.rs:565:5:565:6 | m7 | main.rs:122:1:137:1 | mod m7 |
|
||||
| main.rs:565:5:565:9 | ...::f | main.rs:129:5:136:5 | fn f |
|
||||
| main.rs:566:5:566:6 | m8 | main.rs:139:1:193:1 | mod m8 |
|
||||
| main.rs:566:5:566:9 | ...::g | main.rs:177:5:192:5 | fn g |
|
||||
| main.rs:567:5:567:6 | m9 | main.rs:195:1:203:1 | mod m9 |
|
||||
| main.rs:567:5:567:9 | ...::f | main.rs:198:5:202:5 | fn f |
|
||||
| main.rs:568:5:568:7 | m11 | main.rs:226:1:263:1 | mod m11 |
|
||||
| main.rs:568:5:568:10 | ...::f | main.rs:231:5:234:5 | fn f |
|
||||
| main.rs:569:5:569:7 | m15 | main.rs:294:1:348:1 | mod m15 |
|
||||
| main.rs:569:5:569:10 | ...::f | main.rs:335:5:347:5 | fn f |
|
||||
| main.rs:570:5:570:7 | m16 | main.rs:350:1:442:1 | mod m16 |
|
||||
| main.rs:570:5:570:10 | ...::f | main.rs:417:5:441:5 | fn f |
|
||||
| main.rs:571:5:571:7 | m17 | main.rs:444:1:474:1 | mod m17 |
|
||||
| main.rs:571:5:571:10 | ...::f | main.rs:468:5:473:5 | fn f |
|
||||
| main.rs:572:5:572:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
|
||||
| main.rs:572:5:572:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
|
||||
| main.rs:573:5:573:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
|
||||
| main.rs:573:5:573:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
|
||||
| main.rs:574:5:574:7 | my3 | my2/mod.rs:12:1:12:12 | mod my3 |
|
||||
| main.rs:574:5:574:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
|
||||
| main.rs:575:5:575:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
|
||||
| main.rs:576:5:576:7 | m18 | main.rs:476:1:494:1 | mod m18 |
|
||||
| main.rs:576:5:576:12 | ...::m19 | main.rs:481:5:493:5 | mod m19 |
|
||||
| main.rs:576:5:576:17 | ...::m20 | main.rs:486:9:492:9 | mod m20 |
|
||||
| main.rs:576:5:576:20 | ...::g | main.rs:487:13:491:13 | fn g |
|
||||
| main.rs:577:5:577:7 | m23 | main.rs:523:1:548:1 | mod m23 |
|
||||
| main.rs:577:5:577:10 | ...::f | main.rs:543:5:547:5 | fn f |
|
||||
| my2/mod.rs:5:5:5:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
|
||||
| my2/mod.rs:5:5:5:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
|
||||
| my2/mod.rs:5:5:5:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
|
||||
@@ -302,7 +309,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:50:1:69:1 | fn h |
|
||||
| my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:12:13 | SourceFile |
|
||||
| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:550:2 | SourceFile |
|
||||
| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:578:2 | SourceFile |
|
||||
| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:50:1:69:1 | fn h |
|
||||
| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:12:13 | SourceFile |
|
||||
| my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g |
|
||||
|
||||
@@ -540,6 +540,17 @@ mod type_aliases {
|
||||
PairBoth(Fst, Snd),
|
||||
}
|
||||
|
||||
impl<Fst, Snd> PairOption<Fst, Snd> {
|
||||
fn unwrapSnd(self) -> Snd {
|
||||
match self {
|
||||
PairOption::PairNone() => panic!("PairNone has no second element"),
|
||||
PairOption::PairFst(_) => panic!("PairFst has no second element"),
|
||||
PairOption::PairSnd(snd) => snd,
|
||||
PairOption::PairBoth(_, snd) => snd,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct S1;
|
||||
|
||||
@@ -553,7 +564,18 @@ mod type_aliases {
|
||||
type MyPair = PairOption<S1, S2>;
|
||||
|
||||
// Generic type alias that partially applies the generic type
|
||||
type AnotherPair<Thr> = PairOption<S2, Thr>;
|
||||
type AnotherPair<A3> = PairOption<S2, A3>;
|
||||
|
||||
// Alias to another alias
|
||||
type AliasToAlias<A4> = AnotherPair<A4>;
|
||||
|
||||
// Alias that appears nested within another alias
|
||||
type NestedAlias<A5> = AnotherPair<AliasToAlias<A5>>;
|
||||
|
||||
fn g(t: NestedAlias<S3>) {
|
||||
let x = t.unwrapSnd().unwrapSnd(); // $ method=unwrapSnd type=x:S3
|
||||
println!("{:?}", x);
|
||||
}
|
||||
|
||||
pub fn f() {
|
||||
// Type can be inferred from the constructor
|
||||
@@ -561,16 +583,18 @@ mod type_aliases {
|
||||
println!("{:?}", p1);
|
||||
|
||||
// Type can be only inferred from the type alias
|
||||
let p2: MyPair = PairOption::PairNone(); // types for `Fst` and `Snd` missing
|
||||
let p2: MyPair = PairOption::PairNone(); // $ type=p2:Fst.S1 type=p2:Snd.S2
|
||||
println!("{:?}", p2);
|
||||
|
||||
// First type from alias, second from constructor
|
||||
let p3: AnotherPair<_> = PairOption::PairSnd(S3); // type for `Fst` missing
|
||||
let p3: AnotherPair<_> = PairOption::PairSnd(S3); // $ type=p3:Fst.S2
|
||||
println!("{:?}", p3);
|
||||
|
||||
// First type from alias definition, second from argument to alias
|
||||
let p3: AnotherPair<S3> = PairOption::PairNone(); // type for `Snd` missing, spurious `S3` for `Fst`
|
||||
let p3: AnotherPair<S3> = PairOption::PairNone(); // $ type=p3:Fst.S2 type=p3:Snd.S3
|
||||
println!("{:?}", p3);
|
||||
|
||||
g(PairOption::PairSnd(PairOption::PairSnd(S3)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -495,373 +495,424 @@ inferType
|
||||
| main.rs:530:13:530:13 | y | | main.rs:492:5:493:14 | S2 |
|
||||
| main.rs:530:21:530:27 | into(...) | | main.rs:492:5:493:14 | S2 |
|
||||
| main.rs:530:26:530:26 | x | | main.rs:489:5:490:14 | S1 |
|
||||
| main.rs:560:13:560:14 | p1 | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:560:13:560:14 | p1 | Fst | main.rs:543:5:544:14 | S1 |
|
||||
| main.rs:560:13:560:14 | p1 | Snd | main.rs:546:5:547:14 | S2 |
|
||||
| main.rs:560:26:560:53 | ...::PairBoth(...) | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:560:26:560:53 | ...::PairBoth(...) | Fst | main.rs:543:5:544:14 | S1 |
|
||||
| main.rs:560:26:560:53 | ...::PairBoth(...) | Snd | main.rs:546:5:547:14 | S2 |
|
||||
| main.rs:560:47:560:48 | S1 | | main.rs:543:5:544:14 | S1 |
|
||||
| main.rs:560:51:560:52 | S2 | | main.rs:546:5:547:14 | S2 |
|
||||
| main.rs:561:26:561:27 | p1 | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:561:26:561:27 | p1 | Fst | main.rs:543:5:544:14 | S1 |
|
||||
| main.rs:561:26:561:27 | p1 | Snd | main.rs:546:5:547:14 | S2 |
|
||||
| main.rs:564:13:564:14 | p2 | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:564:26:564:47 | ...::PairNone(...) | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:565:26:565:27 | p2 | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:568:13:568:14 | p3 | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:568:13:568:14 | p3 | Snd | main.rs:549:5:550:14 | S3 |
|
||||
| main.rs:568:34:568:56 | ...::PairSnd(...) | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:568:34:568:56 | ...::PairSnd(...) | Snd | main.rs:549:5:550:14 | S3 |
|
||||
| main.rs:568:54:568:55 | S3 | | main.rs:549:5:550:14 | S3 |
|
||||
| main.rs:569:26:569:27 | p3 | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:569:26:569:27 | p3 | Snd | main.rs:549:5:550:14 | S3 |
|
||||
| main.rs:572:13:572:14 | p3 | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:572:13:572:14 | p3 | Fst | main.rs:549:5:550:14 | S3 |
|
||||
| main.rs:572:35:572:56 | ...::PairNone(...) | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:572:35:572:56 | ...::PairNone(...) | Fst | main.rs:549:5:550:14 | S3 |
|
||||
| main.rs:573:26:573:27 | p3 | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:573:26:573:27 | p3 | Fst | main.rs:549:5:550:14 | S3 |
|
||||
| main.rs:586:16:586:24 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:586:16:586:24 | SelfParam | &T | main.rs:584:5:591:5 | Self [trait MyTrait] |
|
||||
| main.rs:586:27:586:31 | value | | main.rs:584:19:584:19 | S |
|
||||
| main.rs:588:21:588:29 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:588:21:588:29 | SelfParam | &T | main.rs:584:5:591:5 | Self [trait MyTrait] |
|
||||
| main.rs:588:32:588:36 | value | | main.rs:584:19:584:19 | S |
|
||||
| main.rs:589:13:589:16 | self | | file://:0:0:0:0 | & |
|
||||
| main.rs:589:13:589:16 | self | &T | main.rs:584:5:591:5 | Self [trait MyTrait] |
|
||||
| main.rs:589:22:589:26 | value | | main.rs:584:19:584:19 | S |
|
||||
| main.rs:595:16:595:24 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:595:16:595:24 | SelfParam | &T | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:595:16:595:24 | SelfParam | &T.T | main.rs:593:10:593:10 | T |
|
||||
| main.rs:595:27:595:31 | value | | main.rs:593:10:593:10 | T |
|
||||
| main.rs:599:26:601:9 | { ... } | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:599:26:601:9 | { ... } | T | main.rs:598:10:598:10 | T |
|
||||
| main.rs:600:13:600:30 | ...::MyNone(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:600:13:600:30 | ...::MyNone(...) | T | main.rs:598:10:598:10 | T |
|
||||
| main.rs:605:20:605:23 | SelfParam | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:605:20:605:23 | SelfParam | T | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:605:20:605:23 | SelfParam | T.T | main.rs:604:10:604:10 | T |
|
||||
| main.rs:605:41:610:9 | { ... } | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:605:41:610:9 | { ... } | T | main.rs:604:10:604:10 | T |
|
||||
| main.rs:606:13:609:13 | match self { ... } | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:606:13:609:13 | match self { ... } | T | main.rs:604:10:604:10 | T |
|
||||
| main.rs:606:19:606:22 | self | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:606:19:606:22 | self | T | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:606:19:606:22 | self | T.T | main.rs:604:10:604:10 | T |
|
||||
| main.rs:607:39:607:56 | ...::MyNone(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:607:39:607:56 | ...::MyNone(...) | T | main.rs:604:10:604:10 | T |
|
||||
| main.rs:608:34:608:34 | x | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:608:34:608:34 | x | T | main.rs:604:10:604:10 | T |
|
||||
| main.rs:608:40:608:40 | x | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:608:40:608:40 | x | T | main.rs:604:10:604:10 | T |
|
||||
| main.rs:617:13:617:14 | x1 | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:617:18:617:37 | ...::new(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:618:26:618:27 | x1 | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:620:13:620:18 | mut x2 | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:620:13:620:18 | mut x2 | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:620:22:620:36 | ...::new(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:620:22:620:36 | ...::new(...) | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:621:9:621:10 | x2 | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:621:9:621:10 | x2 | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:621:16:621:16 | S | | main.rs:613:5:614:13 | S |
|
||||
| main.rs:622:26:622:27 | x2 | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:622:26:622:27 | x2 | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:624:13:624:18 | mut x3 | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:624:22:624:36 | ...::new(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:625:9:625:10 | x3 | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:625:21:625:21 | S | | main.rs:613:5:614:13 | S |
|
||||
| main.rs:626:26:626:27 | x3 | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:628:13:628:18 | mut x4 | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:628:13:628:18 | mut x4 | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:628:22:628:36 | ...::new(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:628:22:628:36 | ...::new(...) | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:629:23:629:29 | &mut x4 | | file://:0:0:0:0 | & |
|
||||
| main.rs:629:23:629:29 | &mut x4 | &T | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:629:23:629:29 | &mut x4 | &T.T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:629:28:629:29 | x4 | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:629:28:629:29 | x4 | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:629:32:629:32 | S | | main.rs:613:5:614:13 | S |
|
||||
| main.rs:630:26:630:27 | x4 | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:630:26:630:27 | x4 | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:632:13:632:14 | x5 | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:632:13:632:14 | x5 | T | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:632:13:632:14 | x5 | T.T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:632:18:632:58 | ...::MySome(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:632:18:632:58 | ...::MySome(...) | T | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:632:18:632:58 | ...::MySome(...) | T.T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:632:35:632:57 | ...::MyNone(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:632:35:632:57 | ...::MyNone(...) | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:633:26:633:27 | x5 | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:633:26:633:27 | x5 | T | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:633:26:633:27 | x5 | T.T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:635:13:635:14 | x6 | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:635:13:635:14 | x6 | T | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:635:13:635:14 | x6 | T.T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:635:18:635:58 | ...::MySome(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:635:18:635:58 | ...::MySome(...) | T | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:635:18:635:58 | ...::MySome(...) | T.T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:635:35:635:57 | ...::MyNone(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:635:35:635:57 | ...::MyNone(...) | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:636:26:636:61 | ...::flatten(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:636:26:636:61 | ...::flatten(...) | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:636:59:636:60 | x6 | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:636:59:636:60 | x6 | T | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:636:59:636:60 | x6 | T.T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:638:13:638:19 | from_if | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:638:13:638:19 | from_if | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:638:23:642:9 | if ... {...} else {...} | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:638:23:642:9 | if ... {...} else {...} | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:638:36:640:9 | { ... } | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:638:36:640:9 | { ... } | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:639:13:639:30 | ...::MyNone(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:639:13:639:30 | ...::MyNone(...) | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:640:16:642:9 | { ... } | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:640:16:642:9 | { ... } | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:641:13:641:31 | ...::MySome(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:641:13:641:31 | ...::MySome(...) | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:641:30:641:30 | S | | main.rs:613:5:614:13 | S |
|
||||
| main.rs:643:26:643:32 | from_if | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:643:26:643:32 | from_if | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:645:13:645:22 | from_match | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:645:13:645:22 | from_match | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:645:26:648:9 | match ... { ... } | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:645:26:648:9 | match ... { ... } | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:646:21:646:38 | ...::MyNone(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:646:21:646:38 | ...::MyNone(...) | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:647:22:647:40 | ...::MySome(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:647:22:647:40 | ...::MySome(...) | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:647:39:647:39 | S | | main.rs:613:5:614:13 | S |
|
||||
| main.rs:649:26:649:35 | from_match | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:649:26:649:35 | from_match | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:651:13:651:21 | from_loop | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:651:13:651:21 | from_loop | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:651:25:656:9 | loop { ... } | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:651:25:656:9 | loop { ... } | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:653:23:653:40 | ...::MyNone(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:653:23:653:40 | ...::MyNone(...) | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:655:19:655:37 | ...::MySome(...) | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:655:19:655:37 | ...::MySome(...) | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:655:36:655:36 | S | | main.rs:613:5:614:13 | S |
|
||||
| main.rs:657:26:657:34 | from_loop | | main.rs:578:5:582:5 | MyOption |
|
||||
| main.rs:657:26:657:34 | from_loop | T | main.rs:613:5:614:13 | S |
|
||||
| main.rs:670:15:670:18 | SelfParam | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:670:15:670:18 | SelfParam | T | main.rs:669:10:669:10 | T |
|
||||
| main.rs:670:26:672:9 | { ... } | | main.rs:669:10:669:10 | T |
|
||||
| main.rs:671:13:671:16 | self | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:671:13:671:16 | self | T | main.rs:669:10:669:10 | T |
|
||||
| main.rs:671:13:671:18 | self.0 | | main.rs:669:10:669:10 | T |
|
||||
| main.rs:674:15:674:19 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:674:15:674:19 | SelfParam | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:674:15:674:19 | SelfParam | &T.T | main.rs:669:10:669:10 | T |
|
||||
| main.rs:674:28:676:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:674:28:676:9 | { ... } | &T | main.rs:669:10:669:10 | T |
|
||||
| main.rs:675:13:675:19 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:675:13:675:19 | &... | &T | main.rs:669:10:669:10 | T |
|
||||
| main.rs:675:14:675:17 | self | | file://:0:0:0:0 | & |
|
||||
| main.rs:675:14:675:17 | self | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:675:14:675:17 | self | &T.T | main.rs:669:10:669:10 | T |
|
||||
| main.rs:675:14:675:19 | self.0 | | main.rs:669:10:669:10 | T |
|
||||
| main.rs:678:15:678:25 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:678:15:678:25 | SelfParam | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:678:15:678:25 | SelfParam | &T.T | main.rs:669:10:669:10 | T |
|
||||
| main.rs:678:34:680:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:678:34:680:9 | { ... } | &T | main.rs:669:10:669:10 | T |
|
||||
| main.rs:679:13:679:19 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:679:13:679:19 | &... | &T | main.rs:669:10:669:10 | T |
|
||||
| main.rs:679:14:679:17 | self | | file://:0:0:0:0 | & |
|
||||
| main.rs:679:14:679:17 | self | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:679:14:679:17 | self | &T.T | main.rs:669:10:669:10 | T |
|
||||
| main.rs:679:14:679:19 | self.0 | | main.rs:669:10:669:10 | T |
|
||||
| main.rs:684:13:684:14 | x1 | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:684:13:684:14 | x1 | T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:684:18:684:22 | S(...) | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:684:18:684:22 | S(...) | T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:684:20:684:21 | S2 | | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:685:26:685:27 | x1 | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:685:26:685:27 | x1 | T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:685:26:685:32 | x1.m1() | | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:687:13:687:14 | x2 | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:687:13:687:14 | x2 | T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:687:18:687:22 | S(...) | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:687:18:687:22 | S(...) | T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:687:20:687:21 | S2 | | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:689:26:689:27 | x2 | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:689:26:689:27 | x2 | T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:689:26:689:32 | x2.m2() | | file://:0:0:0:0 | & |
|
||||
| main.rs:689:26:689:32 | x2.m2() | &T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:690:26:690:27 | x2 | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:690:26:690:27 | x2 | T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:690:26:690:32 | x2.m3() | | file://:0:0:0:0 | & |
|
||||
| main.rs:690:26:690:32 | x2.m3() | &T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:692:13:692:14 | x3 | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:692:13:692:14 | x3 | T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:692:18:692:22 | S(...) | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:692:18:692:22 | S(...) | T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:692:20:692:21 | S2 | | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:694:26:694:41 | ...::m2(...) | | file://:0:0:0:0 | & |
|
||||
| main.rs:694:26:694:41 | ...::m2(...) | &T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:694:38:694:40 | &x3 | | file://:0:0:0:0 | & |
|
||||
| main.rs:694:38:694:40 | &x3 | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:694:38:694:40 | &x3 | &T.T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:694:39:694:40 | x3 | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:694:39:694:40 | x3 | T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:695:26:695:41 | ...::m3(...) | | file://:0:0:0:0 | & |
|
||||
| main.rs:695:26:695:41 | ...::m3(...) | &T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:695:38:695:40 | &x3 | | file://:0:0:0:0 | & |
|
||||
| main.rs:695:38:695:40 | &x3 | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:695:38:695:40 | &x3 | &T.T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:695:39:695:40 | x3 | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:695:39:695:40 | x3 | T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:697:13:697:14 | x4 | | file://:0:0:0:0 | & |
|
||||
| main.rs:697:13:697:14 | x4 | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:697:13:697:14 | x4 | &T.T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:697:18:697:23 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:697:18:697:23 | &... | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:697:18:697:23 | &... | &T.T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:697:19:697:23 | S(...) | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:697:19:697:23 | S(...) | T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:697:21:697:22 | S2 | | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:699:26:699:27 | x4 | | file://:0:0:0:0 | & |
|
||||
| main.rs:699:26:699:27 | x4 | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:699:26:699:27 | x4 | &T.T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:699:26:699:32 | x4.m2() | | file://:0:0:0:0 | & |
|
||||
| main.rs:699:26:699:32 | x4.m2() | &T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:700:26:700:27 | x4 | | file://:0:0:0:0 | & |
|
||||
| main.rs:700:26:700:27 | x4 | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:700:26:700:27 | x4 | &T.T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:700:26:700:32 | x4.m3() | | file://:0:0:0:0 | & |
|
||||
| main.rs:700:26:700:32 | x4.m3() | &T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:702:13:702:14 | x5 | | file://:0:0:0:0 | & |
|
||||
| main.rs:702:13:702:14 | x5 | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:702:13:702:14 | x5 | &T.T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:702:18:702:23 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:702:18:702:23 | &... | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:702:18:702:23 | &... | &T.T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:702:19:702:23 | S(...) | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:702:19:702:23 | S(...) | T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:702:21:702:22 | S2 | | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:704:26:704:27 | x5 | | file://:0:0:0:0 | & |
|
||||
| main.rs:704:26:704:27 | x5 | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:704:26:704:27 | x5 | &T.T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:704:26:704:32 | x5.m1() | | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:705:26:705:27 | x5 | | file://:0:0:0:0 | & |
|
||||
| main.rs:705:26:705:27 | x5 | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:705:26:705:27 | x5 | &T.T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:705:26:705:29 | x5.0 | | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:707:13:707:14 | x6 | | file://:0:0:0:0 | & |
|
||||
| main.rs:707:13:707:14 | x6 | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:707:13:707:14 | x6 | &T.T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:707:18:707:23 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:707:18:707:23 | &... | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:707:18:707:23 | &... | &T.T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:707:19:707:23 | S(...) | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:707:19:707:23 | S(...) | T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:707:21:707:22 | S2 | | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:709:26:709:30 | (...) | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:709:26:709:30 | (...) | T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:709:26:709:35 | ... .m1() | | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:709:27:709:29 | * ... | | main.rs:663:5:664:19 | S |
|
||||
| main.rs:709:27:709:29 | * ... | T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:709:28:709:29 | x6 | | file://:0:0:0:0 | & |
|
||||
| main.rs:709:28:709:29 | x6 | &T | main.rs:663:5:664:19 | S |
|
||||
| main.rs:709:28:709:29 | x6 | &T.T | main.rs:666:5:667:14 | S2 |
|
||||
| main.rs:716:16:716:20 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:716:16:716:20 | SelfParam | &T | main.rs:714:5:722:5 | Self [trait MyTrait] |
|
||||
| main.rs:719:16:719:20 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:719:16:719:20 | SelfParam | &T | main.rs:714:5:722:5 | Self [trait MyTrait] |
|
||||
| main.rs:719:32:721:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:719:32:721:9 | { ... } | &T | main.rs:714:5:722:5 | Self [trait MyTrait] |
|
||||
| main.rs:720:13:720:16 | self | | file://:0:0:0:0 | & |
|
||||
| main.rs:720:13:720:16 | self | &T | main.rs:714:5:722:5 | Self [trait MyTrait] |
|
||||
| main.rs:720:13:720:22 | self.foo() | | file://:0:0:0:0 | & |
|
||||
| main.rs:720:13:720:22 | self.foo() | &T | main.rs:714:5:722:5 | Self [trait MyTrait] |
|
||||
| main.rs:728:16:728:20 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:728:16:728:20 | SelfParam | &T | main.rs:724:5:724:20 | MyStruct |
|
||||
| main.rs:728:36:730:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:728:36:730:9 | { ... } | &T | main.rs:724:5:724:20 | MyStruct |
|
||||
| main.rs:729:13:729:16 | self | | file://:0:0:0:0 | & |
|
||||
| main.rs:729:13:729:16 | self | &T | main.rs:724:5:724:20 | MyStruct |
|
||||
| main.rs:734:13:734:13 | x | | main.rs:724:5:724:20 | MyStruct |
|
||||
| main.rs:734:17:734:24 | MyStruct | | main.rs:724:5:724:20 | MyStruct |
|
||||
| main.rs:735:9:735:9 | x | | main.rs:724:5:724:20 | MyStruct |
|
||||
| main.rs:735:9:735:15 | x.bar() | | file://:0:0:0:0 | & |
|
||||
| main.rs:735:9:735:15 | x.bar() | &T | main.rs:724:5:724:20 | MyStruct |
|
||||
| main.rs:745:16:745:20 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:745:16:745:20 | SelfParam | &T | main.rs:742:5:742:26 | MyStruct |
|
||||
| main.rs:745:16:745:20 | SelfParam | &T.T | main.rs:744:10:744:10 | T |
|
||||
| main.rs:745:32:747:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:745:32:747:9 | { ... } | &T | main.rs:742:5:742:26 | MyStruct |
|
||||
| main.rs:745:32:747:9 | { ... } | &T.T | main.rs:744:10:744:10 | T |
|
||||
| main.rs:746:13:746:16 | self | | file://:0:0:0:0 | & |
|
||||
| main.rs:746:13:746:16 | self | &T | main.rs:742:5:742:26 | MyStruct |
|
||||
| main.rs:746:13:746:16 | self | &T.T | main.rs:744:10:744:10 | T |
|
||||
| main.rs:751:13:751:13 | x | | main.rs:742:5:742:26 | MyStruct |
|
||||
| main.rs:751:13:751:13 | x | T | main.rs:740:5:740:13 | S |
|
||||
| main.rs:751:17:751:27 | MyStruct(...) | | main.rs:742:5:742:26 | MyStruct |
|
||||
| main.rs:751:17:751:27 | MyStruct(...) | T | main.rs:740:5:740:13 | S |
|
||||
| main.rs:751:26:751:26 | S | | main.rs:740:5:740:13 | S |
|
||||
| main.rs:752:9:752:9 | x | | main.rs:742:5:742:26 | MyStruct |
|
||||
| main.rs:752:9:752:9 | x | T | main.rs:740:5:740:13 | S |
|
||||
| main.rs:752:9:752:15 | x.foo() | | file://:0:0:0:0 | & |
|
||||
| main.rs:752:9:752:15 | x.foo() | &T | main.rs:742:5:742:26 | MyStruct |
|
||||
| main.rs:752:9:752:15 | x.foo() | &T.T | main.rs:740:5:740:13 | S |
|
||||
| main.rs:760:15:760:19 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:760:15:760:19 | SelfParam | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:760:31:762:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:760:31:762:9 | { ... } | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:761:13:761:19 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:761:13:761:19 | &... | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:761:14:761:19 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:761:14:761:19 | &... | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:761:15:761:19 | &self | | file://:0:0:0:0 | & |
|
||||
| main.rs:761:15:761:19 | &self | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:761:16:761:19 | self | | file://:0:0:0:0 | & |
|
||||
| main.rs:761:16:761:19 | self | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:764:15:764:25 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:764:15:764:25 | SelfParam | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:764:37:766:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:764:37:766:9 | { ... } | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:765:13:765:19 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:765:13:765:19 | &... | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:765:14:765:19 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:765:14:765:19 | &... | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:765:15:765:19 | &self | | file://:0:0:0:0 | & |
|
||||
| main.rs:765:15:765:19 | &self | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:765:16:765:19 | self | | file://:0:0:0:0 | & |
|
||||
| main.rs:765:16:765:19 | self | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:768:15:768:15 | x | | file://:0:0:0:0 | & |
|
||||
| main.rs:768:15:768:15 | x | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:768:34:770:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:768:34:770:9 | { ... } | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:769:13:769:13 | x | | file://:0:0:0:0 | & |
|
||||
| main.rs:769:13:769:13 | x | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:772:15:772:15 | x | | file://:0:0:0:0 | & |
|
||||
| main.rs:772:15:772:15 | x | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:772:34:774:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:772:34:774:9 | { ... } | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:773:13:773:16 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:773:13:773:16 | &... | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:773:14:773:16 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:773:14:773:16 | &... | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:773:15:773:16 | &x | | file://:0:0:0:0 | & |
|
||||
| main.rs:773:15:773:16 | &x | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:773:16:773:16 | x | | file://:0:0:0:0 | & |
|
||||
| main.rs:773:16:773:16 | x | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:778:13:778:13 | x | | main.rs:757:5:757:13 | S |
|
||||
| main.rs:778:17:778:20 | S {...} | | main.rs:757:5:757:13 | S |
|
||||
| main.rs:779:9:779:9 | x | | main.rs:757:5:757:13 | S |
|
||||
| main.rs:779:9:779:14 | x.f1() | | file://:0:0:0:0 | & |
|
||||
| main.rs:779:9:779:14 | x.f1() | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:780:9:780:9 | x | | main.rs:757:5:757:13 | S |
|
||||
| main.rs:780:9:780:14 | x.f2() | | file://:0:0:0:0 | & |
|
||||
| main.rs:780:9:780:14 | x.f2() | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:781:9:781:17 | ...::f3(...) | | file://:0:0:0:0 | & |
|
||||
| main.rs:781:9:781:17 | ...::f3(...) | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:781:15:781:16 | &x | | file://:0:0:0:0 | & |
|
||||
| main.rs:781:15:781:16 | &x | &T | main.rs:757:5:757:13 | S |
|
||||
| main.rs:781:16:781:16 | x | | main.rs:757:5:757:13 | S |
|
||||
| main.rs:787:5:787:20 | ...::f(...) | | main.rs:67:5:67:21 | Foo |
|
||||
| main.rs:788:5:788:60 | ...::g(...) | | main.rs:67:5:67:21 | Foo |
|
||||
| main.rs:788:20:788:38 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
|
||||
| main.rs:788:41:788:59 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
|
||||
| main.rs:544:22:544:25 | SelfParam | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:544:22:544:25 | SelfParam | Fst | main.rs:543:10:543:12 | Fst |
|
||||
| main.rs:544:22:544:25 | SelfParam | Snd | main.rs:543:15:543:17 | Snd |
|
||||
| main.rs:544:35:551:9 | { ... } | | main.rs:543:15:543:17 | Snd |
|
||||
| main.rs:545:13:550:13 | match self { ... } | | main.rs:543:15:543:17 | Snd |
|
||||
| main.rs:545:19:545:22 | self | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:545:19:545:22 | self | Fst | main.rs:543:10:543:12 | Fst |
|
||||
| main.rs:545:19:545:22 | self | Snd | main.rs:543:15:543:17 | Snd |
|
||||
| main.rs:546:43:546:82 | MacroExpr | | main.rs:543:15:543:17 | Snd |
|
||||
| main.rs:547:43:547:81 | MacroExpr | | main.rs:543:15:543:17 | Snd |
|
||||
| main.rs:548:37:548:39 | snd | | main.rs:543:15:543:17 | Snd |
|
||||
| main.rs:548:45:548:47 | snd | | main.rs:543:15:543:17 | Snd |
|
||||
| main.rs:549:41:549:43 | snd | | main.rs:543:15:543:17 | Snd |
|
||||
| main.rs:549:49:549:51 | snd | | main.rs:543:15:543:17 | Snd |
|
||||
| main.rs:575:10:575:10 | t | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:575:10:575:10 | t | Fst | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:575:10:575:10 | t | Snd | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:575:10:575:10 | t | Snd.Fst | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:575:10:575:10 | t | Snd.Snd | main.rs:560:5:561:14 | S3 |
|
||||
| main.rs:576:13:576:13 | x | | main.rs:560:5:561:14 | S3 |
|
||||
| main.rs:576:17:576:17 | t | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:576:17:576:17 | t | Fst | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:576:17:576:17 | t | Snd | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:576:17:576:17 | t | Snd.Fst | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:576:17:576:17 | t | Snd.Snd | main.rs:560:5:561:14 | S3 |
|
||||
| main.rs:576:17:576:29 | t.unwrapSnd() | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:576:17:576:29 | t.unwrapSnd() | Fst | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:576:17:576:29 | t.unwrapSnd() | Snd | main.rs:560:5:561:14 | S3 |
|
||||
| main.rs:576:17:576:41 | ... .unwrapSnd() | | main.rs:560:5:561:14 | S3 |
|
||||
| main.rs:577:26:577:26 | x | | main.rs:560:5:561:14 | S3 |
|
||||
| main.rs:582:13:582:14 | p1 | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:582:13:582:14 | p1 | Fst | main.rs:554:5:555:14 | S1 |
|
||||
| main.rs:582:13:582:14 | p1 | Snd | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:582:26:582:53 | ...::PairBoth(...) | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:582:26:582:53 | ...::PairBoth(...) | Fst | main.rs:554:5:555:14 | S1 |
|
||||
| main.rs:582:26:582:53 | ...::PairBoth(...) | Snd | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:582:47:582:48 | S1 | | main.rs:554:5:555:14 | S1 |
|
||||
| main.rs:582:51:582:52 | S2 | | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:583:26:583:27 | p1 | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:583:26:583:27 | p1 | Fst | main.rs:554:5:555:14 | S1 |
|
||||
| main.rs:583:26:583:27 | p1 | Snd | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:586:13:586:14 | p2 | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:586:13:586:14 | p2 | Fst | main.rs:554:5:555:14 | S1 |
|
||||
| main.rs:586:13:586:14 | p2 | Snd | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:586:26:586:47 | ...::PairNone(...) | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:586:26:586:47 | ...::PairNone(...) | Fst | main.rs:554:5:555:14 | S1 |
|
||||
| main.rs:586:26:586:47 | ...::PairNone(...) | Snd | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:587:26:587:27 | p2 | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:587:26:587:27 | p2 | Fst | main.rs:554:5:555:14 | S1 |
|
||||
| main.rs:587:26:587:27 | p2 | Snd | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:590:13:590:14 | p3 | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:590:13:590:14 | p3 | Fst | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:590:13:590:14 | p3 | Snd | main.rs:560:5:561:14 | S3 |
|
||||
| main.rs:590:34:590:56 | ...::PairSnd(...) | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:590:34:590:56 | ...::PairSnd(...) | Fst | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:590:34:590:56 | ...::PairSnd(...) | Snd | main.rs:560:5:561:14 | S3 |
|
||||
| main.rs:590:54:590:55 | S3 | | main.rs:560:5:561:14 | S3 |
|
||||
| main.rs:591:26:591:27 | p3 | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:591:26:591:27 | p3 | Fst | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:591:26:591:27 | p3 | Snd | main.rs:560:5:561:14 | S3 |
|
||||
| main.rs:594:13:594:14 | p3 | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:594:13:594:14 | p3 | Fst | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:594:13:594:14 | p3 | Snd | main.rs:560:5:561:14 | S3 |
|
||||
| main.rs:594:35:594:56 | ...::PairNone(...) | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:594:35:594:56 | ...::PairNone(...) | Fst | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:594:35:594:56 | ...::PairNone(...) | Snd | main.rs:560:5:561:14 | S3 |
|
||||
| main.rs:595:26:595:27 | p3 | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:595:26:595:27 | p3 | Fst | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:595:26:595:27 | p3 | Snd | main.rs:560:5:561:14 | S3 |
|
||||
| main.rs:597:11:597:54 | ...::PairSnd(...) | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:597:11:597:54 | ...::PairSnd(...) | Fst | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:597:11:597:54 | ...::PairSnd(...) | Snd | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:597:11:597:54 | ...::PairSnd(...) | Snd.Fst | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:597:11:597:54 | ...::PairSnd(...) | Snd.Snd | main.rs:560:5:561:14 | S3 |
|
||||
| main.rs:597:31:597:53 | ...::PairSnd(...) | | main.rs:535:5:541:5 | PairOption |
|
||||
| main.rs:597:31:597:53 | ...::PairSnd(...) | Fst | main.rs:557:5:558:14 | S2 |
|
||||
| main.rs:597:31:597:53 | ...::PairSnd(...) | Snd | main.rs:560:5:561:14 | S3 |
|
||||
| main.rs:597:51:597:52 | S3 | | main.rs:560:5:561:14 | S3 |
|
||||
| main.rs:610:16:610:24 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:610:16:610:24 | SelfParam | &T | main.rs:608:5:615:5 | Self [trait MyTrait] |
|
||||
| main.rs:610:27:610:31 | value | | main.rs:608:19:608:19 | S |
|
||||
| main.rs:612:21:612:29 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:612:21:612:29 | SelfParam | &T | main.rs:608:5:615:5 | Self [trait MyTrait] |
|
||||
| main.rs:612:32:612:36 | value | | main.rs:608:19:608:19 | S |
|
||||
| main.rs:613:13:613:16 | self | | file://:0:0:0:0 | & |
|
||||
| main.rs:613:13:613:16 | self | &T | main.rs:608:5:615:5 | Self [trait MyTrait] |
|
||||
| main.rs:613:22:613:26 | value | | main.rs:608:19:608:19 | S |
|
||||
| main.rs:619:16:619:24 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:619:16:619:24 | SelfParam | &T | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:619:16:619:24 | SelfParam | &T.T | main.rs:617:10:617:10 | T |
|
||||
| main.rs:619:27:619:31 | value | | main.rs:617:10:617:10 | T |
|
||||
| main.rs:623:26:625:9 | { ... } | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:623:26:625:9 | { ... } | T | main.rs:622:10:622:10 | T |
|
||||
| main.rs:624:13:624:30 | ...::MyNone(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:624:13:624:30 | ...::MyNone(...) | T | main.rs:622:10:622:10 | T |
|
||||
| main.rs:629:20:629:23 | SelfParam | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:629:20:629:23 | SelfParam | T | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:629:20:629:23 | SelfParam | T.T | main.rs:628:10:628:10 | T |
|
||||
| main.rs:629:41:634:9 | { ... } | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:629:41:634:9 | { ... } | T | main.rs:628:10:628:10 | T |
|
||||
| main.rs:630:13:633:13 | match self { ... } | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:630:13:633:13 | match self { ... } | T | main.rs:628:10:628:10 | T |
|
||||
| main.rs:630:19:630:22 | self | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:630:19:630:22 | self | T | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:630:19:630:22 | self | T.T | main.rs:628:10:628:10 | T |
|
||||
| main.rs:631:39:631:56 | ...::MyNone(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:631:39:631:56 | ...::MyNone(...) | T | main.rs:628:10:628:10 | T |
|
||||
| main.rs:632:34:632:34 | x | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:632:34:632:34 | x | T | main.rs:628:10:628:10 | T |
|
||||
| main.rs:632:40:632:40 | x | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:632:40:632:40 | x | T | main.rs:628:10:628:10 | T |
|
||||
| main.rs:641:13:641:14 | x1 | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:641:18:641:37 | ...::new(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:642:26:642:27 | x1 | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:644:13:644:18 | mut x2 | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:644:13:644:18 | mut x2 | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:644:22:644:36 | ...::new(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:644:22:644:36 | ...::new(...) | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:645:9:645:10 | x2 | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:645:9:645:10 | x2 | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:645:16:645:16 | S | | main.rs:637:5:638:13 | S |
|
||||
| main.rs:646:26:646:27 | x2 | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:646:26:646:27 | x2 | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:648:13:648:18 | mut x3 | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:648:22:648:36 | ...::new(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:649:9:649:10 | x3 | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:649:21:649:21 | S | | main.rs:637:5:638:13 | S |
|
||||
| main.rs:650:26:650:27 | x3 | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:652:13:652:18 | mut x4 | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:652:13:652:18 | mut x4 | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:652:22:652:36 | ...::new(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:652:22:652:36 | ...::new(...) | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:653:23:653:29 | &mut x4 | | file://:0:0:0:0 | & |
|
||||
| main.rs:653:23:653:29 | &mut x4 | &T | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:653:23:653:29 | &mut x4 | &T.T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:653:28:653:29 | x4 | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:653:28:653:29 | x4 | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:653:32:653:32 | S | | main.rs:637:5:638:13 | S |
|
||||
| main.rs:654:26:654:27 | x4 | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:654:26:654:27 | x4 | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:656:13:656:14 | x5 | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:656:13:656:14 | x5 | T | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:656:13:656:14 | x5 | T.T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:656:18:656:58 | ...::MySome(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:656:18:656:58 | ...::MySome(...) | T | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:656:18:656:58 | ...::MySome(...) | T.T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:656:35:656:57 | ...::MyNone(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:656:35:656:57 | ...::MyNone(...) | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:657:26:657:27 | x5 | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:657:26:657:27 | x5 | T | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:657:26:657:27 | x5 | T.T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:659:13:659:14 | x6 | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:659:13:659:14 | x6 | T | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:659:13:659:14 | x6 | T.T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:659:18:659:58 | ...::MySome(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:659:18:659:58 | ...::MySome(...) | T | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:659:18:659:58 | ...::MySome(...) | T.T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:659:35:659:57 | ...::MyNone(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:659:35:659:57 | ...::MyNone(...) | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:660:26:660:61 | ...::flatten(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:660:26:660:61 | ...::flatten(...) | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:660:59:660:60 | x6 | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:660:59:660:60 | x6 | T | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:660:59:660:60 | x6 | T.T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:662:13:662:19 | from_if | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:662:13:662:19 | from_if | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:662:23:666:9 | if ... {...} else {...} | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:662:23:666:9 | if ... {...} else {...} | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:662:36:664:9 | { ... } | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:662:36:664:9 | { ... } | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:663:13:663:30 | ...::MyNone(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:663:13:663:30 | ...::MyNone(...) | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:664:16:666:9 | { ... } | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:664:16:666:9 | { ... } | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:665:13:665:31 | ...::MySome(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:665:13:665:31 | ...::MySome(...) | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:665:30:665:30 | S | | main.rs:637:5:638:13 | S |
|
||||
| main.rs:667:26:667:32 | from_if | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:667:26:667:32 | from_if | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:669:13:669:22 | from_match | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:669:13:669:22 | from_match | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:669:26:672:9 | match ... { ... } | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:669:26:672:9 | match ... { ... } | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:670:21:670:38 | ...::MyNone(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:670:21:670:38 | ...::MyNone(...) | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:671:22:671:40 | ...::MySome(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:671:22:671:40 | ...::MySome(...) | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:671:39:671:39 | S | | main.rs:637:5:638:13 | S |
|
||||
| main.rs:673:26:673:35 | from_match | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:673:26:673:35 | from_match | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:675:13:675:21 | from_loop | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:675:13:675:21 | from_loop | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:675:25:680:9 | loop { ... } | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:675:25:680:9 | loop { ... } | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:677:23:677:40 | ...::MyNone(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:677:23:677:40 | ...::MyNone(...) | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:679:19:679:37 | ...::MySome(...) | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:679:19:679:37 | ...::MySome(...) | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:679:36:679:36 | S | | main.rs:637:5:638:13 | S |
|
||||
| main.rs:681:26:681:34 | from_loop | | main.rs:602:5:606:5 | MyOption |
|
||||
| main.rs:681:26:681:34 | from_loop | T | main.rs:637:5:638:13 | S |
|
||||
| main.rs:694:15:694:18 | SelfParam | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:694:15:694:18 | SelfParam | T | main.rs:693:10:693:10 | T |
|
||||
| main.rs:694:26:696:9 | { ... } | | main.rs:693:10:693:10 | T |
|
||||
| main.rs:695:13:695:16 | self | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:695:13:695:16 | self | T | main.rs:693:10:693:10 | T |
|
||||
| main.rs:695:13:695:18 | self.0 | | main.rs:693:10:693:10 | T |
|
||||
| main.rs:698:15:698:19 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:698:15:698:19 | SelfParam | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:698:15:698:19 | SelfParam | &T.T | main.rs:693:10:693:10 | T |
|
||||
| main.rs:698:28:700:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:698:28:700:9 | { ... } | &T | main.rs:693:10:693:10 | T |
|
||||
| main.rs:699:13:699:19 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:699:13:699:19 | &... | &T | main.rs:693:10:693:10 | T |
|
||||
| main.rs:699:14:699:17 | self | | file://:0:0:0:0 | & |
|
||||
| main.rs:699:14:699:17 | self | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:699:14:699:17 | self | &T.T | main.rs:693:10:693:10 | T |
|
||||
| main.rs:699:14:699:19 | self.0 | | main.rs:693:10:693:10 | T |
|
||||
| main.rs:702:15:702:25 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:702:15:702:25 | SelfParam | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:702:15:702:25 | SelfParam | &T.T | main.rs:693:10:693:10 | T |
|
||||
| main.rs:702:34:704:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:702:34:704:9 | { ... } | &T | main.rs:693:10:693:10 | T |
|
||||
| main.rs:703:13:703:19 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:703:13:703:19 | &... | &T | main.rs:693:10:693:10 | T |
|
||||
| main.rs:703:14:703:17 | self | | file://:0:0:0:0 | & |
|
||||
| main.rs:703:14:703:17 | self | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:703:14:703:17 | self | &T.T | main.rs:693:10:693:10 | T |
|
||||
| main.rs:703:14:703:19 | self.0 | | main.rs:693:10:693:10 | T |
|
||||
| main.rs:708:13:708:14 | x1 | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:708:13:708:14 | x1 | T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:708:18:708:22 | S(...) | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:708:18:708:22 | S(...) | T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:708:20:708:21 | S2 | | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:709:26:709:27 | x1 | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:709:26:709:27 | x1 | T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:709:26:709:32 | x1.m1() | | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:711:13:711:14 | x2 | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:711:13:711:14 | x2 | T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:711:18:711:22 | S(...) | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:711:18:711:22 | S(...) | T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:711:20:711:21 | S2 | | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:713:26:713:27 | x2 | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:713:26:713:27 | x2 | T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:713:26:713:32 | x2.m2() | | file://:0:0:0:0 | & |
|
||||
| main.rs:713:26:713:32 | x2.m2() | &T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:714:26:714:27 | x2 | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:714:26:714:27 | x2 | T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:714:26:714:32 | x2.m3() | | file://:0:0:0:0 | & |
|
||||
| main.rs:714:26:714:32 | x2.m3() | &T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:716:13:716:14 | x3 | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:716:13:716:14 | x3 | T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:716:18:716:22 | S(...) | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:716:18:716:22 | S(...) | T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:716:20:716:21 | S2 | | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:718:26:718:41 | ...::m2(...) | | file://:0:0:0:0 | & |
|
||||
| main.rs:718:26:718:41 | ...::m2(...) | &T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:718:38:718:40 | &x3 | | file://:0:0:0:0 | & |
|
||||
| main.rs:718:38:718:40 | &x3 | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:718:38:718:40 | &x3 | &T.T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:718:39:718:40 | x3 | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:718:39:718:40 | x3 | T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:719:26:719:41 | ...::m3(...) | | file://:0:0:0:0 | & |
|
||||
| main.rs:719:26:719:41 | ...::m3(...) | &T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:719:38:719:40 | &x3 | | file://:0:0:0:0 | & |
|
||||
| main.rs:719:38:719:40 | &x3 | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:719:38:719:40 | &x3 | &T.T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:719:39:719:40 | x3 | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:719:39:719:40 | x3 | T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:721:13:721:14 | x4 | | file://:0:0:0:0 | & |
|
||||
| main.rs:721:13:721:14 | x4 | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:721:13:721:14 | x4 | &T.T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:721:18:721:23 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:721:18:721:23 | &... | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:721:18:721:23 | &... | &T.T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:721:19:721:23 | S(...) | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:721:19:721:23 | S(...) | T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:721:21:721:22 | S2 | | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:723:26:723:27 | x4 | | file://:0:0:0:0 | & |
|
||||
| main.rs:723:26:723:27 | x4 | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:723:26:723:27 | x4 | &T.T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:723:26:723:32 | x4.m2() | | file://:0:0:0:0 | & |
|
||||
| main.rs:723:26:723:32 | x4.m2() | &T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:724:26:724:27 | x4 | | file://:0:0:0:0 | & |
|
||||
| main.rs:724:26:724:27 | x4 | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:724:26:724:27 | x4 | &T.T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:724:26:724:32 | x4.m3() | | file://:0:0:0:0 | & |
|
||||
| main.rs:724:26:724:32 | x4.m3() | &T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:726:13:726:14 | x5 | | file://:0:0:0:0 | & |
|
||||
| main.rs:726:13:726:14 | x5 | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:726:13:726:14 | x5 | &T.T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:726:18:726:23 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:726:18:726:23 | &... | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:726:18:726:23 | &... | &T.T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:726:19:726:23 | S(...) | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:726:19:726:23 | S(...) | T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:726:21:726:22 | S2 | | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:728:26:728:27 | x5 | | file://:0:0:0:0 | & |
|
||||
| main.rs:728:26:728:27 | x5 | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:728:26:728:27 | x5 | &T.T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:728:26:728:32 | x5.m1() | | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:729:26:729:27 | x5 | | file://:0:0:0:0 | & |
|
||||
| main.rs:729:26:729:27 | x5 | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:729:26:729:27 | x5 | &T.T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:729:26:729:29 | x5.0 | | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:731:13:731:14 | x6 | | file://:0:0:0:0 | & |
|
||||
| main.rs:731:13:731:14 | x6 | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:731:13:731:14 | x6 | &T.T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:731:18:731:23 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:731:18:731:23 | &... | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:731:18:731:23 | &... | &T.T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:731:19:731:23 | S(...) | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:731:19:731:23 | S(...) | T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:731:21:731:22 | S2 | | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:733:26:733:30 | (...) | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:733:26:733:30 | (...) | T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:733:26:733:35 | ... .m1() | | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:733:27:733:29 | * ... | | main.rs:687:5:688:19 | S |
|
||||
| main.rs:733:27:733:29 | * ... | T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:733:28:733:29 | x6 | | file://:0:0:0:0 | & |
|
||||
| main.rs:733:28:733:29 | x6 | &T | main.rs:687:5:688:19 | S |
|
||||
| main.rs:733:28:733:29 | x6 | &T.T | main.rs:690:5:691:14 | S2 |
|
||||
| main.rs:740:16:740:20 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:740:16:740:20 | SelfParam | &T | main.rs:738:5:746:5 | Self [trait MyTrait] |
|
||||
| main.rs:743:16:743:20 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:743:16:743:20 | SelfParam | &T | main.rs:738:5:746:5 | Self [trait MyTrait] |
|
||||
| main.rs:743:32:745:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:743:32:745:9 | { ... } | &T | main.rs:738:5:746:5 | Self [trait MyTrait] |
|
||||
| main.rs:744:13:744:16 | self | | file://:0:0:0:0 | & |
|
||||
| main.rs:744:13:744:16 | self | &T | main.rs:738:5:746:5 | Self [trait MyTrait] |
|
||||
| main.rs:744:13:744:22 | self.foo() | | file://:0:0:0:0 | & |
|
||||
| main.rs:744:13:744:22 | self.foo() | &T | main.rs:738:5:746:5 | Self [trait MyTrait] |
|
||||
| main.rs:752:16:752:20 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:752:16:752:20 | SelfParam | &T | main.rs:748:5:748:20 | MyStruct |
|
||||
| main.rs:752:36:754:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:752:36:754:9 | { ... } | &T | main.rs:748:5:748:20 | MyStruct |
|
||||
| main.rs:753:13:753:16 | self | | file://:0:0:0:0 | & |
|
||||
| main.rs:753:13:753:16 | self | &T | main.rs:748:5:748:20 | MyStruct |
|
||||
| main.rs:758:13:758:13 | x | | main.rs:748:5:748:20 | MyStruct |
|
||||
| main.rs:758:17:758:24 | MyStruct | | main.rs:748:5:748:20 | MyStruct |
|
||||
| main.rs:759:9:759:9 | x | | main.rs:748:5:748:20 | MyStruct |
|
||||
| main.rs:759:9:759:15 | x.bar() | | file://:0:0:0:0 | & |
|
||||
| main.rs:759:9:759:15 | x.bar() | &T | main.rs:748:5:748:20 | MyStruct |
|
||||
| main.rs:769:16:769:20 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:769:16:769:20 | SelfParam | &T | main.rs:766:5:766:26 | MyStruct |
|
||||
| main.rs:769:16:769:20 | SelfParam | &T.T | main.rs:768:10:768:10 | T |
|
||||
| main.rs:769:32:771:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:769:32:771:9 | { ... } | &T | main.rs:766:5:766:26 | MyStruct |
|
||||
| main.rs:769:32:771:9 | { ... } | &T.T | main.rs:768:10:768:10 | T |
|
||||
| main.rs:770:13:770:16 | self | | file://:0:0:0:0 | & |
|
||||
| main.rs:770:13:770:16 | self | &T | main.rs:766:5:766:26 | MyStruct |
|
||||
| main.rs:770:13:770:16 | self | &T.T | main.rs:768:10:768:10 | T |
|
||||
| main.rs:775:13:775:13 | x | | main.rs:766:5:766:26 | MyStruct |
|
||||
| main.rs:775:13:775:13 | x | T | main.rs:764:5:764:13 | S |
|
||||
| main.rs:775:17:775:27 | MyStruct(...) | | main.rs:766:5:766:26 | MyStruct |
|
||||
| main.rs:775:17:775:27 | MyStruct(...) | T | main.rs:764:5:764:13 | S |
|
||||
| main.rs:775:26:775:26 | S | | main.rs:764:5:764:13 | S |
|
||||
| main.rs:776:9:776:9 | x | | main.rs:766:5:766:26 | MyStruct |
|
||||
| main.rs:776:9:776:9 | x | T | main.rs:764:5:764:13 | S |
|
||||
| main.rs:776:9:776:15 | x.foo() | | file://:0:0:0:0 | & |
|
||||
| main.rs:776:9:776:15 | x.foo() | &T | main.rs:766:5:766:26 | MyStruct |
|
||||
| main.rs:776:9:776:15 | x.foo() | &T.T | main.rs:764:5:764:13 | S |
|
||||
| main.rs:784:15:784:19 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:784:15:784:19 | SelfParam | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:784:31:786:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:784:31:786:9 | { ... } | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:785:13:785:19 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:785:13:785:19 | &... | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:785:14:785:19 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:785:14:785:19 | &... | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:785:15:785:19 | &self | | file://:0:0:0:0 | & |
|
||||
| main.rs:785:15:785:19 | &self | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:785:16:785:19 | self | | file://:0:0:0:0 | & |
|
||||
| main.rs:785:16:785:19 | self | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:788:15:788:25 | SelfParam | | file://:0:0:0:0 | & |
|
||||
| main.rs:788:15:788:25 | SelfParam | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:788:37:790:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:788:37:790:9 | { ... } | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:789:13:789:19 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:789:13:789:19 | &... | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:789:14:789:19 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:789:14:789:19 | &... | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:789:15:789:19 | &self | | file://:0:0:0:0 | & |
|
||||
| main.rs:789:15:789:19 | &self | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:789:16:789:19 | self | | file://:0:0:0:0 | & |
|
||||
| main.rs:789:16:789:19 | self | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:792:15:792:15 | x | | file://:0:0:0:0 | & |
|
||||
| main.rs:792:15:792:15 | x | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:792:34:794:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:792:34:794:9 | { ... } | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:793:13:793:13 | x | | file://:0:0:0:0 | & |
|
||||
| main.rs:793:13:793:13 | x | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:796:15:796:15 | x | | file://:0:0:0:0 | & |
|
||||
| main.rs:796:15:796:15 | x | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:796:34:798:9 | { ... } | | file://:0:0:0:0 | & |
|
||||
| main.rs:796:34:798:9 | { ... } | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:797:13:797:16 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:797:13:797:16 | &... | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:797:14:797:16 | &... | | file://:0:0:0:0 | & |
|
||||
| main.rs:797:14:797:16 | &... | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:797:15:797:16 | &x | | file://:0:0:0:0 | & |
|
||||
| main.rs:797:15:797:16 | &x | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:797:16:797:16 | x | | file://:0:0:0:0 | & |
|
||||
| main.rs:797:16:797:16 | x | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:802:13:802:13 | x | | main.rs:781:5:781:13 | S |
|
||||
| main.rs:802:17:802:20 | S {...} | | main.rs:781:5:781:13 | S |
|
||||
| main.rs:803:9:803:9 | x | | main.rs:781:5:781:13 | S |
|
||||
| main.rs:803:9:803:14 | x.f1() | | file://:0:0:0:0 | & |
|
||||
| main.rs:803:9:803:14 | x.f1() | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:804:9:804:9 | x | | main.rs:781:5:781:13 | S |
|
||||
| main.rs:804:9:804:14 | x.f2() | | file://:0:0:0:0 | & |
|
||||
| main.rs:804:9:804:14 | x.f2() | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:805:9:805:17 | ...::f3(...) | | file://:0:0:0:0 | & |
|
||||
| main.rs:805:9:805:17 | ...::f3(...) | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:805:15:805:16 | &x | | file://:0:0:0:0 | & |
|
||||
| main.rs:805:15:805:16 | &x | &T | main.rs:781:5:781:13 | S |
|
||||
| main.rs:805:16:805:16 | x | | main.rs:781:5:781:13 | S |
|
||||
| main.rs:811:5:811:20 | ...::f(...) | | main.rs:67:5:67:21 | Foo |
|
||||
| main.rs:812:5:812:60 | ...::g(...) | | main.rs:67:5:67:21 | Foo |
|
||||
| main.rs:812:20:812:38 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
|
||||
| main.rs:812:41:812:59 | ...::Foo {...} | | main.rs:67:5:67:21 | Foo |
|
||||
|
||||
Reference in New Issue
Block a user