Merge branch 'main' into badalloc

This commit is contained in:
Geoffrey White
2025-04-08 10:15:38 +01:00
63 changed files with 7030 additions and 778 deletions

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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`.

View File

@@ -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"]

View File

@@ -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

View File

@@ -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

View 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
}
}
}

View File

@@ -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 (

View File

@@ -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"]

View File

@@ -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"]

View File

@@ -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)

View File

@@ -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`.
}

View File

@@ -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)
}

View File

@@ -1,5 +0,0 @@
package sources
func Source[T any]() T {
return *new(T)
}

File diff suppressed because it is too large Load Diff

View File

@@ -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

View File

@@ -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
*/

View File

@@ -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
*/

View File

@@ -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
*/

View File

@@ -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)`.

View File

@@ -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" }
}
/**

View File

@@ -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
}
}

View File

@@ -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" }
}

View File

@@ -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;

View File

@@ -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() }
}

View File

@@ -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) }
}

View File

@@ -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 {

View File

@@ -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 { }

View File

@@ -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)
}
}
}

View File

@@ -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

View File

@@ -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) }
}

View File

@@ -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())

View 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.

View File

@@ -1,4 +1,5 @@
- queries: .
- include:
id:
- rb/database-query-in-loop
- rb/database-query-in-loop
- rb/useless-assignment-to-local

View 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>

View File

@@ -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()
)
}
}

View File

@@ -0,0 +1,5 @@
def f(x)
result = send(x)
waitForResponse
return getResponse
end

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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 |

View File

@@ -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 |

View File

@@ -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

View File

@@ -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 |

View File

@@ -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

View File

@@ -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 |

View File

@@ -0,0 +1,2 @@
query: queries/variables/DeadStoreOfLocal.ql
postprocess: utils/test/InlineExpectationsTestQuery.ql

View File

@@ -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

View File

@@ -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

View 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"]

View File

@@ -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 |

View File

@@ -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 {

View File

@@ -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(...) |

View File

@@ -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());
}

View File

@@ -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 |

View File

@@ -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 |

View File

@@ -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
}

View File

@@ -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 |

View File

@@ -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)));
}
}

View File

@@ -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 |