Skip to content

Commit 533aa7f

Browse files
committed
Rust: Add tests for std::Pin.
1 parent df28e3b commit 533aa7f

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ edges
5555
| main.rs:84:29:84:29 | [post] y [&ref] | main.rs:85:33:85:33 | y [&ref] | provenance | |
5656
| main.rs:84:32:84:41 | source(...) | main.rs:84:29:84:29 | [post] y [&ref] | provenance | MaD:7 |
5757
| main.rs:85:33:85:33 | y [&ref] | main.rs:85:18:85:34 | ...::read(...) | provenance | MaD:6 |
58+
| main.rs:100:13:100:17 | mut i | main.rs:105:14:105:14 | i | provenance | |
59+
| main.rs:100:21:100:30 | source(...) | main.rs:100:13:100:17 | mut i | provenance | |
60+
| main.rs:114:13:114:18 | mut ms [MyStruct] | main.rs:119:14:119:15 | ms [MyStruct] | provenance | |
61+
| main.rs:114:22:114:49 | MyStruct {...} [MyStruct] | main.rs:114:13:114:18 | mut ms [MyStruct] | provenance | |
62+
| main.rs:114:38:114:47 | source(...) | main.rs:114:22:114:49 | MyStruct {...} [MyStruct] | provenance | |
63+
| main.rs:119:14:119:15 | ms [MyStruct] | main.rs:119:14:119:19 | ms.val | provenance | |
5864
nodes
5965
| main.rs:12:9:12:9 | a [Some] | semmle.label | a [Some] |
6066
| main.rs:12:13:12:28 | Some(...) [Some] | semmle.label | Some(...) [Some] |
@@ -108,6 +114,14 @@ nodes
108114
| main.rs:84:32:84:41 | source(...) | semmle.label | source(...) |
109115
| main.rs:85:18:85:34 | ...::read(...) | semmle.label | ...::read(...) |
110116
| main.rs:85:33:85:33 | y [&ref] | semmle.label | y [&ref] |
117+
| main.rs:100:13:100:17 | mut i | semmle.label | mut i |
118+
| main.rs:100:21:100:30 | source(...) | semmle.label | source(...) |
119+
| main.rs:105:14:105:14 | i | semmle.label | i |
120+
| main.rs:114:13:114:18 | mut ms [MyStruct] | semmle.label | mut ms [MyStruct] |
121+
| main.rs:114:22:114:49 | MyStruct {...} [MyStruct] | semmle.label | MyStruct {...} [MyStruct] |
122+
| main.rs:114:38:114:47 | source(...) | semmle.label | source(...) |
123+
| main.rs:119:14:119:15 | ms [MyStruct] | semmle.label | ms [MyStruct] |
124+
| main.rs:119:14:119:19 | ms.val | semmle.label | ms.val |
111125
subpaths
112126
testFailures
113127
#select
@@ -121,3 +135,5 @@ testFailures
121135
| main.rs:47:38:47:38 | n | main.rs:41:30:41:39 | source(...) | main.rs:47:38:47:38 | n | $@ | main.rs:41:30:41:39 | source(...) | source(...) |
122136
| main.rs:63:22:63:22 | m | main.rs:58:22:58:31 | source(...) | main.rs:63:22:63:22 | m | $@ | main.rs:58:22:58:31 | source(...) | source(...) |
123137
| main.rs:85:18:85:34 | ...::read(...) | main.rs:84:32:84:41 | source(...) | main.rs:85:18:85:34 | ...::read(...) | $@ | main.rs:84:32:84:41 | source(...) | source(...) |
138+
| main.rs:105:14:105:14 | i | main.rs:100:21:100:30 | source(...) | main.rs:105:14:105:14 | i | $@ | main.rs:100:21:100:30 | source(...) | source(...) |
139+
| main.rs:119:14:119:19 | ms.val | main.rs:114:38:114:47 | source(...) | main.rs:119:14:119:19 | ms.val | $@ | main.rs:114:38:114:47 | source(...) | source(...) |

rust/ql/test/library-tests/dataflow/modeled/main.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,64 @@ mod ptr {
8787
}
8888
}
8989

90+
use std::pin::Pin;
91+
use std::pin::pin;
92+
93+
#[derive(Clone)]
94+
struct MyStruct {
95+
val: i64,
96+
}
97+
98+
fn test_pin() {
99+
{
100+
let mut i = source(40);
101+
let mut pin1 = Pin::new(&i);
102+
let mut pin2 = Box::pin(i);
103+
let mut pin3 = Box::into_pin(Box::new(i));
104+
let mut pin4 = pin!(i);
105+
sink(i); // $ hasValueFlow=40
106+
sink(*pin1); // $ MISSING: hasValueFlow=40
107+
sink(*Pin::into_inner(pin1)); // $ MISSING: hasValueFlow=40
108+
sink(*pin2); // $ MISSING: hasValueFlow=40
109+
sink(*pin3); // $ MISSING: hasValueFlow=40
110+
sink(*pin4); // $ MISSING: hasValueFlow=40
111+
}
112+
113+
{
114+
let mut ms = MyStruct { val: source(41) };
115+
let mut pin1 = Pin::new(&ms);
116+
let mut pin2 = Box::pin(ms.clone());
117+
let mut pin3 = Box::into_pin(Box::new(ms.clone()));
118+
let mut pin4 = pin!(&ms);
119+
sink(ms.val); // $ hasValueFlow=41
120+
sink(pin1.val); // $ MISSING: hasValueFlow=41
121+
sink(Pin::into_inner(pin1).val); // $ MISSING: hasValueFlow=41
122+
sink(pin2.val); // $ MISSING: hasValueFlow=41
123+
sink(pin3.val); // $ MISSING: hasValueFlow=41
124+
sink(pin4.val); // $ MISSING: hasValueFlow=41
125+
}
126+
127+
unsafe {
128+
let mut ms = MyStruct { val: source(42) };
129+
let mut pin5 = Pin::new_unchecked(&ms);
130+
sink(pin5.val); // $ MISSING: hasValueFlow=42
131+
sink(Pin::into_inner_unchecked(pin5).val); // $ MISSING: hasValueFlow=40
132+
}
133+
134+
{
135+
let mut ms = MyStruct { val: source(43) };
136+
let mut ms2 = MyStruct { val: source(44) };
137+
let mut pin = Pin::new(&mut ms);
138+
sink(pin.val); // $ MISSING: hasValueFlow=43
139+
pin.set(ms2);
140+
sink(pin.val); // $ MISSING: hasValueFlow=44
141+
}
142+
}
143+
90144
fn main() {
91145
option_clone();
92146
result_clone();
93147
i64_clone();
94148
my_clone::wrapper_clone();
149+
test_pin();
95150
}

0 commit comments

Comments
 (0)