Skip to content

Commit b9f2773

Browse files
committed
Rust: Support Rust 1.99 standard library changes
Update the affected Rust expectations for rust-analyzer 0.0.357 and add models for the canonical alloc/core I/O paths introduced by Rust 1.99. Model the new pin macro helper so pin! retains value flow without test failures. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 9aa1104f-468b-4aa4-b605-e46c22c1e398
1 parent 36fc3b7 commit b9f2773

10 files changed

Lines changed: 274 additions & 231 deletions

File tree

‎rust/ql/lib/codeql/rust/frameworks/log.model.yml‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ extensions:
1414
- ["<std::io::stdio::StdoutLock as std::io::Write>::write_all", "Argument[0]", "log-injection", "manual"]
1515
- ["<std::io::stdio::StderrLock as std::io::Write>::write", "Argument[0]", "log-injection", "manual"]
1616
- ["<std::io::stdio::StderrLock as std::io::Write>::write_all", "Argument[0]", "log-injection", "manual"]
17+
- ["<std::io::stdio::StdoutLock as core::io::write::Write>::write", "Argument[0]", "log-injection", "manual"]
18+
- ["<std::io::stdio::StdoutLock as core::io::write::Write>::write_all", "Argument[0]", "log-injection", "manual"]
19+
- ["<std::io::stdio::StderrLock as core::io::write::Write>::write", "Argument[0]", "log-injection", "manual"]
20+
- ["<std::io::stdio::StderrLock as core::io::write::Write>::write_all", "Argument[0]", "log-injection", "manual"]
1721
- ["core::panicking::panic_fmt", "Argument[0]", "log-injection", "manual"]
1822
- ["core::panicking::assert_failed", "Argument[3].Field[core::option::Option::Some(0)]", "log-injection", "manual"]
1923
- ["<core::option::Option>::expect", "Argument[0]", "log-injection", "manual"]

‎rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ extensions:
111111
# This model is not precise, but helps in cases where a `Pin` is implicitly dereferenced.
112112
- ["<core::pin::Pin>::new", "Argument[0].Reference", "ReturnValue", "value", "manual"]
113113
- ["<core::pin::Pin>::new_unchecked", "Argument[0]", "ReturnValue.Field[core::pin::Pin::pointer]", "value", "manual"]
114+
- ["core::pin::pin_new_unchecked_in_helper", "Argument[0].Reference.Field[core::pin::PinMacroHelper::value]", "ReturnValue.Field[core::pin::Pin::pointer].Reference", "value", "manual"]
114115
- ["<core::pin::Pin>::into_inner", "Argument[0].Field[core::pin::Pin::pointer]", "ReturnValue", "value", "manual"]
115116
- ["<core::pin::Pin>::into_inner_unchecked", "Argument[0].Field[core::pin::Pin::pointer]", "ReturnValue", "value", "manual"]
116117
- ["<core::pin::Pin>::set", "Argument[0]", "Argument[self].Reference.Field[core::pin::Pin::pointer]", "value", "manual"]

‎rust/ql/lib/codeql/rust/frameworks/stdlib/fs.model.yml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,6 @@ extensions:
8989
# Overwrite generated models
9090
- ["<std::fs::File as std::io::Read>::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
9191
- ["<std::fs::File as std::io::Read>::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
92+
- ["<std::fs::File as alloc::io::read::Read>::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
93+
- ["<std::fs::File as alloc::io::read::Read>::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
9294

‎rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,34 @@ extensions:
4141
- ["<std::io::stdio::StdinRaw as std::io::Read>::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
4242
- ["<std::io::stdio::StdinRaw as std::io::Read>::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
4343
- ["<std::io::buffered::bufreader::BufReader as std::io::BufRead>::fill_buf", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"]
44+
# Rust 1.99 moved the shared I/O implementation from `std` to `alloc`.
45+
- ["<alloc::io::buffered::bufreader::BufReader>::new", "Argument[0]", "ReturnValue", "taint", "manual"]
46+
- ["<alloc::io::buf_read::BufRead>::fill_buf", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"]
47+
- ["<alloc::io::buffered::bufreader::BufReader>::buffer", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"]
48+
- ["<alloc::io::read::Read>::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
49+
- ["<alloc::io::read::Read>::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
50+
- ["<alloc::io::read::Read>::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
51+
- ["<alloc::io::read::Read>::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
52+
- ["<alloc::io::buf_read::BufRead>::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
53+
- ["<alloc::io::buf_read::BufRead>::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"]
54+
- ["<alloc::io::buf_read::BufRead>::split", "Argument[self]", "ReturnValue", "taint", "manual"]
55+
- ["<alloc::io::buf_read::BufRead>::lines", "Argument[self]", "ReturnValue", "taint", "manual"]
56+
- ["<alloc::io::read::Read>::bytes", "Argument[self]", "ReturnValue", "taint", "manual"]
57+
- ["<alloc::io::read::Read>::chain", "Argument[self]", "ReturnValue", "taint", "manual"]
58+
- ["<alloc::io::read::Read>::chain", "Argument[0]", "ReturnValue", "taint", "manual"]
59+
- ["<alloc::io::read::Read>::take", "Argument[self]", "ReturnValue", "taint", "manual"]
60+
- ["<alloc::io::util::Split as core::iter::traits::iterator::Iterator>::next", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "value", "manual"]
61+
- ["<std::io::stdio::Stdin as alloc::io::read::Read>::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
62+
- ["<std::io::stdio::Stdin as alloc::io::read::Read>::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
63+
- ["<std::io::stdio::Stdin as alloc::io::read::Read>::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
64+
- ["<std::io::stdio::Stdin as alloc::io::read::Read>::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
65+
- ["<std::io::stdio::StdinLock as alloc::io::read::Read>::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
66+
- ["<std::io::stdio::StdinLock as alloc::io::read::Read>::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
67+
- ["<std::io::stdio::StdinLock as alloc::io::read::Read>::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
68+
- ["<std::io::stdio::StdinLock as alloc::io::read::Read>::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
69+
- ["<std::io::stdio::StdinLock as alloc::io::buf_read::BufRead>::fill_buf", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"]
70+
- ["<std::io::stdio::StdinRaw as alloc::io::read::Read>::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
71+
- ["<std::io::stdio::StdinRaw as alloc::io::read::Read>::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
72+
- ["<std::io::stdio::StdinRaw as alloc::io::read::Read>::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
73+
- ["<std::io::stdio::StdinRaw as alloc::io::read::Read>::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
74+
- ["<alloc::io::buffered::bufreader::BufReader as alloc::io::buf_read::BufRead>::fill_buf", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"]

‎rust/ql/test/extractor-tests/crate_graph/crates.expected‎

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
#-----| core -> Crate(core@0.0.0)
6363
#-----| foldhash -> Crate(foldhash@0.2.0)
6464

65-
#-----| Crate(libc@0.2.185)
65+
#-----| Crate(libc@0.2.189)
6666
#-----| rustc_std_workspace_core -> Crate(core@0.0.0)
6767

6868
main.rs:
@@ -98,23 +98,23 @@ main.rs:
9898
#-----| Crate(panic_unwind@0.0.0)
9999
#-----| alloc -> Crate(alloc@0.0.0)
100100
#-----| core -> Crate(core@0.0.0)
101-
#-----| libc -> Crate(libc@0.2.185)
101+
#-----| libc -> Crate(libc@0.2.189)
102102
#-----| unwind -> Crate(unwind@0.0.0)
103103

104104
#-----| Crate(proc_macro@0.0.0)
105105
#-----| core -> Crate(core@0.0.0)
106106
#-----| std -> Crate(std@0.0.0)
107107
#-----| rustc_literal_escaper -> Crate(rustc_literal_escaper@0.0.8)
108108

109-
#-----| Crate(rand@0.9.2)
110-
#-----| rand_core -> Crate(rand_core@0.9.3)
109+
#-----| Crate(rand@0.9.5)
110+
#-----| rand_core -> Crate(rand_core@0.9.5)
111111

112-
#-----| Crate(rand_core@0.9.3)
112+
#-----| Crate(rand_core@0.9.5)
113113

114114
#-----| Crate(rand_xorshift@0.4.0)
115-
#-----| rand_core -> Crate(rand_core@0.9.3)
115+
#-----| rand_core -> Crate(rand_core@0.9.5)
116116

117-
#-----| Crate(rustc_demangle@0.1.27)
117+
#-----| Crate(rustc_demangle@0.1.28)
118118
#-----| core -> Crate(core@0.0.0)
119119

120120
#-----| Crate(rustc_literal_escaper@0.0.8)
@@ -124,25 +124,25 @@ main.rs:
124124
#-----| alloc -> Crate(alloc@0.0.0)
125125
#-----| core -> Crate(core@0.0.0)
126126
#-----| panic_abort -> Crate(panic_abort@0.0.0)
127-
#-----| libc -> Crate(libc@0.2.185)
127+
#-----| libc -> Crate(libc@0.2.189)
128128
#-----| unwind -> Crate(unwind@0.0.0)
129129
#-----| panic_unwind -> Crate(panic_unwind@0.0.0)
130130
#-----| std_detect -> Crate(std_detect@0.1.5)
131131
#-----| cfg_if -> Crate(cfg_if@1.0.4)
132132
#-----| hashbrown -> Crate(hashbrown@0.17.1)
133-
#-----| rand -> Crate(rand@0.9.2)
133+
#-----| rand -> Crate(rand@0.9.5)
134134
#-----| rand_xorshift -> Crate(rand_xorshift@0.4.0)
135-
#-----| rustc_demangle -> Crate(rustc_demangle@0.1.27)
135+
#-----| rustc_demangle -> Crate(rustc_demangle@0.1.28)
136136

137137
#-----| Crate(std_detect@0.1.5)
138138
#-----| alloc -> Crate(alloc@0.0.0)
139139
#-----| core -> Crate(core@0.0.0)
140-
#-----| libc -> Crate(libc@0.2.185)
140+
#-----| libc -> Crate(libc@0.2.189)
141141

142142
#-----| Crate(test@0.0.0)
143143
#-----| core -> Crate(core@0.0.0)
144144
#-----| std -> Crate(std@0.0.0)
145-
#-----| libc -> Crate(libc@0.2.185)
145+
#-----| libc -> Crate(libc@0.2.189)
146146
#-----| getopts -> Crate(getopts@0.2.24)
147147

148148
lib.rs:
@@ -164,7 +164,7 @@ lib.rs:
164164

165165
#-----| Crate(unwind@0.0.0)
166166
#-----| core -> Crate(core@0.0.0)
167-
#-----| libc -> Crate(libc@0.2.185)
167+
#-----| libc -> Crate(libc@0.2.189)
168168

169169
#-----| Crate(version_check@0.9.5)
170170
#-----| proc_macro -> Crate(proc_macro@0.0.0)

‎rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected‎

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,9 @@ models
2121
| 20 | Summary: <core::pin::Pin>::new; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value |
2222
| 21 | Summary: <core::pin::Pin>::new_unchecked; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value |
2323
| 22 | Summary: <core::result::Result>::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
24-
| 23 | Summary: core::ptr::read; Argument[0].Reference; ReturnValue; value |
25-
| 24 | Summary: core::ptr::write; Argument[1]; Argument[0].Reference; value |
24+
| 23 | Summary: core::pin::pin_new_unchecked_in_helper; Argument[0].Reference.Field[core::pin::PinMacroHelper::value]; ReturnValue.Field[core::pin::Pin::pointer].Reference; value |
25+
| 24 | Summary: core::ptr::read; Argument[0].Reference; ReturnValue; value |
26+
| 25 | Summary: core::ptr::write; Argument[1]; Argument[0].Reference; value |
2627
edges
2728
| main.rs:12:9:12:9 | a [Some] | main.rs:13:10:13:10 | a [Some] | provenance | |
2829
| main.rs:12:9:12:9 | a [Some] | main.rs:14:13:14:13 | a [Some] | provenance | |
@@ -83,12 +84,12 @@ edges
8384
| main.rs:79:33:79:46 | ... + ... | main.rs:79:17:79:47 | a.map_or(...) | provenance | MaD:12 |
8485
| main.rs:79:37:79:46 | source(...) | main.rs:79:33:79:46 | ... + ... | provenance | MaD:11 |
8586
| main.rs:92:29:92:29 | [post] y [&ref] | main.rs:93:33:93:33 | y [&ref] | provenance | |
86-
| main.rs:92:32:92:41 | source(...) | main.rs:92:29:92:29 | [post] y [&ref] | provenance | MaD:24 |
87-
| main.rs:93:33:93:33 | y [&ref] | main.rs:93:18:93:34 | ...::read(...) | provenance | MaD:23 |
87+
| main.rs:92:32:92:41 | source(...) | main.rs:92:29:92:29 | [post] y [&ref] | provenance | MaD:25 |
88+
| main.rs:93:33:93:33 | y [&ref] | main.rs:93:18:93:34 | ...::read(...) | provenance | MaD:24 |
8889
| main.rs:108:13:108:17 | mut i | main.rs:109:34:109:34 | i | provenance | |
8990
| main.rs:108:13:108:17 | mut i | main.rs:110:33:110:33 | i | provenance | |
9091
| main.rs:108:13:108:17 | mut i | main.rs:111:47:111:47 | i | provenance | |
91-
| main.rs:108:13:108:17 | mut i | main.rs:112:24:112:27 | mut pinned | provenance | |
92+
| main.rs:108:13:108:17 | mut i | main.rs:112:29:112:29 | i | provenance | |
9293
| main.rs:108:13:108:17 | mut i | main.rs:113:14:113:14 | i | provenance | |
9394
| main.rs:108:21:108:30 | source(...) | main.rs:108:13:108:17 | mut i | provenance | |
9495
| main.rs:109:13:109:20 | mut pin1 | main.rs:114:15:114:18 | pin1 | provenance | |
@@ -108,10 +109,12 @@ edges
108109
| main.rs:111:38:111:48 | ...::new(...) [Box(0)] | main.rs:111:24:111:49 | ...::into_pin(...) [Pin, Box(0)] | provenance | MaD:2 |
109110
| main.rs:111:47:111:47 | i | main.rs:111:38:111:48 | ...::new(...) [Box(0)] | provenance | MaD:3 |
110111
| main.rs:112:13:112:20 | mut pin4 [Pin, &ref] | main.rs:118:15:118:18 | pin4 [Pin, &ref] | provenance | |
111-
| main.rs:112:24:112:27 | &mut pinned [&ref] | main.rs:112:24:112:27 | ...::new_unchecked(...) [Pin, &ref] | provenance | MaD:21 |
112-
| main.rs:112:24:112:27 | ...::new_unchecked(...) [Pin, &ref] | main.rs:112:13:112:20 | mut pin4 [Pin, &ref] | provenance | |
113-
| main.rs:112:24:112:27 | mut pinned | main.rs:112:24:112:27 | pinned | provenance | |
114-
| main.rs:112:24:112:27 | pinned | main.rs:112:24:112:27 | &mut pinned [&ref] | provenance | |
112+
| main.rs:112:24:112:27 | &mut pinned [&ref, PinMacroHelper] | main.rs:112:24:112:27 | ...::pin_new_unchecked_in_helper(...) [Pin, &ref] | provenance | MaD:23 |
113+
| main.rs:112:24:112:27 | ...::pin_new_unchecked_in_helper(...) [Pin, &ref] | main.rs:112:13:112:20 | mut pin4 [Pin, &ref] | provenance | |
114+
| main.rs:112:24:112:27 | mut pinned [PinMacroHelper] | main.rs:112:24:112:27 | pinned [PinMacroHelper] | provenance | |
115+
| main.rs:112:24:112:27 | pinned [PinMacroHelper] | main.rs:112:24:112:27 | &mut pinned [&ref, PinMacroHelper] | provenance | |
116+
| main.rs:112:29:112:29 | ...::PinMacroHelper {...} [PinMacroHelper] | main.rs:112:24:112:27 | mut pinned [PinMacroHelper] | provenance | |
117+
| main.rs:112:29:112:29 | i | main.rs:112:29:112:29 | ...::PinMacroHelper {...} [PinMacroHelper] | provenance | |
115118
| main.rs:114:15:114:18 | pin1 | main.rs:114:14:114:18 | * ... | provenance | MaD:15 |
116119
| main.rs:114:15:114:18 | pin1 | main.rs:114:14:114:18 | * ... | provenance | MaD:16 |
117120
| main.rs:114:15:114:18 | pin1 [Pin, &ref] | main.rs:114:14:114:18 | * ... | provenance | MaD:16 |
@@ -253,10 +256,12 @@ nodes
253256
| main.rs:111:38:111:48 | ...::new(...) [Box(0)] | semmle.label | ...::new(...) [Box(0)] |
254257
| main.rs:111:47:111:47 | i | semmle.label | i |
255258
| main.rs:112:13:112:20 | mut pin4 [Pin, &ref] | semmle.label | mut pin4 [Pin, &ref] |
256-
| main.rs:112:24:112:27 | &mut pinned [&ref] | semmle.label | &mut pinned [&ref] |
257-
| main.rs:112:24:112:27 | ...::new_unchecked(...) [Pin, &ref] | semmle.label | ...::new_unchecked(...) [Pin, &ref] |
258-
| main.rs:112:24:112:27 | mut pinned | semmle.label | mut pinned |
259-
| main.rs:112:24:112:27 | pinned | semmle.label | pinned |
259+
| main.rs:112:24:112:27 | &mut pinned [&ref, PinMacroHelper] | semmle.label | &mut pinned [&ref, PinMacroHelper] |
260+
| main.rs:112:24:112:27 | ...::pin_new_unchecked_in_helper(...) [Pin, &ref] | semmle.label | ...::pin_new_unchecked_in_helper(...) [Pin, &ref] |
261+
| main.rs:112:24:112:27 | mut pinned [PinMacroHelper] | semmle.label | mut pinned [PinMacroHelper] |
262+
| main.rs:112:24:112:27 | pinned [PinMacroHelper] | semmle.label | pinned [PinMacroHelper] |
263+
| main.rs:112:29:112:29 | ...::PinMacroHelper {...} [PinMacroHelper] | semmle.label | ...::PinMacroHelper {...} [PinMacroHelper] |
264+
| main.rs:112:29:112:29 | i | semmle.label | i |
260265
| main.rs:113:14:113:14 | i | semmle.label | i |
261266
| main.rs:114:14:114:18 | * ... | semmle.label | * ... |
262267
| main.rs:114:15:114:18 | pin1 | semmle.label | pin1 |

0 commit comments

Comments
 (0)