Skip to content

Commit 79d40e6

Browse files
authored
Merge pull request #22376 from github/hvitved-rust-canonical-paths
Rust: Change canonical paths for trait items
2 parents d9428f4 + 4f48b45 commit 79d40e6

39 files changed

Lines changed: 1324 additions & 1324 deletions

docs/codeql/codeql-language-guides/customizing-library-models-for-rust.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ Canonical paths take the following forms:
7474
- **Free functions**: ``crate::module::function``, for example ``std::env::var`` or ``std::fs::read_to_string``.
7575
- **Inherent methods**: ``<Type>::method``, for example ``<std::fs::File>::open``.
7676
- **Trait methods with a concrete type**: ``<Type as Trait>::method``, for example ``<std::fs::File as std::io::Read>::read_to_end``.
77-
- **Trait methods with a wildcard type**: ``<_ as Trait>::method``, for example ``<_ as core::clone::Clone>::clone``. This form matches any type that implements the trait and is useful for modeling broadly applicable trait methods. For a type that has a specific model (<Type as Trait>::method), that model will take precedence over the trait model.
77+
- **Trait methods**: ``Trait::method``, for example ``core::clone::Clone::clone``. This form matches any type that implements the trait and is useful for modeling broadly applicable trait methods. For a type that has a specific model (``<Type as Trait>::method``), that model will take precedence over the trait model.
7878

7979
Examples of custom model definitions
8080
-------------------------------------
@@ -270,10 +270,10 @@ We need to add tuples to the ``summaryModel(path, input, output, kind, provenanc
270270
pack: codeql/rust-all
271271
extensible: summaryModel
272272
data:
273-
- ["<_ as core::iter::traits::iterator::Iterator>::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"]
273+
- ["core::iter::traits::iterator::Iterator::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"]
274274
275275
276-
- The first value ``<_ as core::iter::traits::iterator::Iterator>::map`` is the canonical path. The ``<_ as Trait>::method`` form uses a wildcard type (``_``) to match any type that implements the ``Iterator`` trait.
276+
- The first value ``core::iter::traits::iterator::Iterator::map`` is the canonical path. The ``Trait::method`` form matches any type that implements the ``Iterator`` trait.
277277
- The second value ``Argument[self].Element`` is the access path to the input — the elements of the iterator (the receiver).
278278
- The third value ``Argument[0].Parameter[0]`` is the access path to the output:
279279

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Canonical paths for Rust trait items now use the format `crate::Trait::item` instead of
5+
`<_ as crate::Trait>::item`. Custom data extension models that reference trait items
6+
must be updated to use the new format.

rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ private module Aliases {
357357
*
358358
* However, this would require support for [generalized reverse flow][1], which
359359
* is not yet implemented, so instead we simulate reverse flow where it would
360-
* have applied via the model for `<_ as core::ops::index::IndexMut>::index_mut`.
360+
* have applied via the model for `core::ops::index::IndexMut::index_mut`.
361361
*
362362
* The same is the case for compound assignments like `a[i] += rhs`, which are
363363
* treated as `(*a.index_mut(i)).add_assign(rhs)`.

rust/ql/lib/codeql/rust/frameworks/asyncstd/io.model.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ extensions:
33
pack: codeql/rust-all
44
extensible: summaryModel
55
data:
6-
- ["<_ as async_std::io::read::ReadExt>::read", "Argument[self]", "Argument[0].Reference", "taint", "manual"]
7-
- ["<_ as async_std::io::read::ReadExt>::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
6+
- ["async_std::io::read::ReadExt::read", "Argument[self]", "Argument[0].Reference", "taint", "manual"]
7+
- ["async_std::io::read::ReadExt::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]

rust/ql/lib/codeql/rust/frameworks/futures.model.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ extensions:
55
data:
66
- ["futures_executor::local_pool::block_on", "Argument[0]", "ReturnValue", "value", "manual"]
77
- ["<futures_util::io::buf_reader::BufReader>::new", "Argument[0]", "ReturnValue", "taint", "manual"]
8-
- ["<_ as futures_util::io::AsyncReadExt>::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
9-
- ["<_ as futures_util::io::AsyncReadExt>::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
10-
- ["<_ as futures_util::io::AsyncBufReadExt>::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
11-
- ["<_ as futures_util::io::AsyncBufReadExt>::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"]
12-
- ["<_ as futures_util::io::AsyncBufReadExt>::fill_buf", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"]
13-
- ["<_ as futures_util::io::AsyncBufReadExt>::lines", "Argument[self]", "ReturnValue", "taint", "manual"]
14-
- ["<_ as futures_io::if_std::AsyncBufRead>::poll_fill_buf", "Argument[self].Reference", "ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]", "taint", "manual"]
15-
- ["<_ as futures_io::if_std::AsyncRead>::poll_read", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"]
8+
- ["futures_util::io::AsyncReadExt::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
9+
- ["futures_util::io::AsyncReadExt::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
10+
- ["futures_util::io::AsyncBufReadExt::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
11+
- ["futures_util::io::AsyncBufReadExt::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"]
12+
- ["futures_util::io::AsyncBufReadExt::fill_buf", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"]
13+
- ["futures_util::io::AsyncBufReadExt::lines", "Argument[self]", "ReturnValue", "taint", "manual"]
14+
- ["futures_io::if_std::AsyncBufRead::poll_fill_buf", "Argument[self].Reference", "ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]", "taint", "manual"]
15+
- ["futures_io::if_std::AsyncRead::poll_read", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"]

rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,28 @@ extensions:
33
pack: codeql/rust-all
44
extensible: sinkModel
55
data:
6-
- ["<_ as mysql_async::queryable::Queryable>::query", "Argument[0]", "sql-injection", "manual"]
7-
- ["<_ as mysql_async::queryable::Queryable>::query_drop", "Argument[0]", "sql-injection", "manual"]
8-
- ["<_ as mysql_async::queryable::Queryable>::query_first", "Argument[0]", "sql-injection", "manual"]
9-
- ["<_ as mysql_async::queryable::Queryable>::query_fold", "Argument[0]", "sql-injection", "manual"]
10-
- ["<_ as mysql_async::queryable::Queryable>::query_stream", "Argument[0]", "sql-injection", "manual"]
11-
- ["<_ as mysql_async::queryable::Queryable>::query_map", "Argument[0]", "sql-injection", "manual"]
6+
- ["mysql_async::queryable::Queryable::query", "Argument[0]", "sql-injection", "manual"]
7+
- ["mysql_async::queryable::Queryable::query_drop", "Argument[0]", "sql-injection", "manual"]
8+
- ["mysql_async::queryable::Queryable::query_first", "Argument[0]", "sql-injection", "manual"]
9+
- ["mysql_async::queryable::Queryable::query_fold", "Argument[0]", "sql-injection", "manual"]
10+
- ["mysql_async::queryable::Queryable::query_stream", "Argument[0]", "sql-injection", "manual"]
11+
- ["mysql_async::queryable::Queryable::query_map", "Argument[0]", "sql-injection", "manual"]
1212
- ["<mysql_async::conn::Conn as mysql_async::queryable::Queryable>::query_iter", "Argument[0]", "sql-injection", "manual"]
1313
- ["<mysql_async::conn::Conn as mysql_async::queryable::Queryable>::prep", "Argument[0]", "sql-injection", "manual"]
1414
- addsTo:
1515
pack: codeql/rust-all
1616
extensible: sourceModel
1717
data:
18-
- ["<_ as mysql_async::queryable::Queryable>::query", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"]
19-
- ["<_ as mysql_async::queryable::Queryable>::exec", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"]
20-
- ["<_ as mysql_async::queryable::Queryable>::query_first", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"]
21-
- ["<_ as mysql_async::queryable::Queryable>::exec_first", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"]
22-
- ["<_ as mysql_async::queryable::Queryable>::query_fold", "Argument[2].Parameter[1]", "database", "manual"]
23-
- ["<_ as mysql_async::queryable::Queryable>::exec_fold", "Argument[3].Parameter[1]", "database", "manual"]
18+
- ["mysql_async::queryable::Queryable::query", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"]
19+
- ["mysql_async::queryable::Queryable::exec", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"]
20+
- ["mysql_async::queryable::Queryable::query_first", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"]
21+
- ["mysql_async::queryable::Queryable::exec_first", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"]
22+
- ["mysql_async::queryable::Queryable::query_fold", "Argument[2].Parameter[1]", "database", "manual"]
23+
- ["mysql_async::queryable::Queryable::exec_fold", "Argument[3].Parameter[1]", "database", "manual"]
2424
- ["<mysql_async::conn::Conn as mysql_async::queryable::Queryable>::query_iter", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"]
2525
- ["<mysql_async::conn::Conn as mysql_async::queryable::Queryable>::exec_iter", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"]
26-
- ["<_ as mysql_async::queryable::Queryable>::query_map", "Argument[1].Parameter[0]", "database", "manual"]
27-
- ["<_ as mysql_async::queryable::Queryable>::exec_map", "Argument[2].Parameter[0]", "database", "manual"]
26+
- ["mysql_async::queryable::Queryable::query_map", "Argument[1].Parameter[0]", "database", "manual"]
27+
- ["mysql_async::queryable::Queryable::exec_map", "Argument[2].Parameter[0]", "database", "manual"]
2828
- ["<mysql_common::row::Row>::get", "ReturnValue.Field[core::option::Option::Some(0)]", "database", "manual"]
2929
- ["<mysql_common::row::Row>::get_opt", "ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "database", "manual"]
3030
- ["<mysql_common::row::Row>::take", "ReturnValue.Field[core::option::Option::Some(0)]", "database", "manual"]
@@ -35,9 +35,9 @@ extensions:
3535
pack: codeql/rust-all
3636
extensible: summaryModel
3737
data:
38-
- ["<_ as mysql_async::queryable::Queryable>::query_fold", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"]
39-
- ["<_ as mysql_async::queryable::Queryable>::query_fold", "Argument[2].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "value", "manual"]
40-
- ["<_ as mysql_async::queryable::Queryable>::exec_fold", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"]
41-
- ["<_ as mysql_async::queryable::Queryable>::exec_fold", "Argument[3].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "value", "manual"]
42-
- ["<_ as mysql_async::queryable::Queryable>::query_map", "Argument[1].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "value", "manual"]
43-
- ["<_ as mysql_async::queryable::Queryable>::query_map", "Argument[2].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "value", "manual"]
38+
- ["mysql_async::queryable::Queryable::query_fold", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"]
39+
- ["mysql_async::queryable::Queryable::query_fold", "Argument[2].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "value", "manual"]
40+
- ["mysql_async::queryable::Queryable::exec_fold", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"]
41+
- ["mysql_async::queryable::Queryable::exec_fold", "Argument[3].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "value", "manual"]
42+
- ["mysql_async::queryable::Queryable::query_map", "Argument[1].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "value", "manual"]
43+
- ["mysql_async::queryable::Queryable::query_map", "Argument[2].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "value", "manual"]

0 commit comments

Comments
 (0)