Rust: Add data flow tests for borrows

This commit is contained in:
Simon Friis Vindum
2024-12-18 13:00:38 +01:00
parent 87b9e6001d
commit b5b8af3aa2
2 changed files with 56 additions and 24 deletions

View File

@@ -8,15 +8,15 @@ edges
| main.rs:15:9:15:9 | c | main.rs:16:10:16:10 | c | provenance | |
| main.rs:15:13:15:14 | * ... | main.rs:15:9:15:9 | c | provenance | |
| main.rs:15:14:15:14 | b [&ref] | main.rs:15:13:15:14 | * ... | provenance | |
| main.rs:40:18:40:21 | SelfParam [MyNumber] | main.rs:41:15:41:18 | self [MyNumber] | provenance | |
| main.rs:41:15:41:18 | self [MyNumber] | main.rs:42:13:42:38 | ...::MyNumber(...) [MyNumber] | provenance | |
| main.rs:42:13:42:38 | ...::MyNumber(...) [MyNumber] | main.rs:42:32:42:37 | number | provenance | |
| main.rs:42:32:42:37 | number | main.rs:40:31:46:5 | { ... } | provenance | |
| main.rs:58:9:58:17 | my_number [MyNumber] | main.rs:59:10:59:18 | my_number [MyNumber] | provenance | |
| main.rs:58:21:58:50 | ...::MyNumber(...) [MyNumber] | main.rs:58:9:58:17 | my_number [MyNumber] | provenance | |
| main.rs:58:40:58:49 | source(...) | main.rs:58:21:58:50 | ...::MyNumber(...) [MyNumber] | provenance | |
| main.rs:59:10:59:18 | my_number [MyNumber] | main.rs:40:18:40:21 | SelfParam [MyNumber] | provenance | |
| main.rs:59:10:59:18 | my_number [MyNumber] | main.rs:59:10:59:30 | my_number.to_number(...) | provenance | |
| main.rs:49:18:49:21 | SelfParam [MyNumber] | main.rs:50:15:50:18 | self [MyNumber] | provenance | |
| main.rs:50:15:50:18 | self [MyNumber] | main.rs:51:13:51:38 | ...::MyNumber(...) [MyNumber] | provenance | |
| main.rs:51:13:51:38 | ...::MyNumber(...) [MyNumber] | main.rs:51:32:51:37 | number | provenance | |
| main.rs:51:32:51:37 | number | main.rs:49:31:55:5 | { ... } | provenance | |
| main.rs:67:9:67:17 | my_number [MyNumber] | main.rs:68:10:68:18 | my_number [MyNumber] | provenance | |
| main.rs:67:21:67:50 | ...::MyNumber(...) [MyNumber] | main.rs:67:9:67:17 | my_number [MyNumber] | provenance | |
| main.rs:67:40:67:49 | source(...) | main.rs:67:21:67:50 | ...::MyNumber(...) [MyNumber] | provenance | |
| main.rs:68:10:68:18 | my_number [MyNumber] | main.rs:49:18:49:21 | SelfParam [MyNumber] | provenance | |
| main.rs:68:10:68:18 | my_number [MyNumber] | main.rs:68:10:68:30 | my_number.to_number(...) | provenance | |
nodes
| main.rs:13:9:13:9 | a | semmle.label | a |
| main.rs:13:13:13:22 | source(...) | semmle.label | source(...) |
@@ -27,19 +27,20 @@ nodes
| main.rs:15:13:15:14 | * ... | semmle.label | * ... |
| main.rs:15:14:15:14 | b [&ref] | semmle.label | b [&ref] |
| main.rs:16:10:16:10 | c | semmle.label | c |
| main.rs:40:18:40:21 | SelfParam [MyNumber] | semmle.label | SelfParam [MyNumber] |
| main.rs:40:31:46:5 | { ... } | semmle.label | { ... } |
| main.rs:41:15:41:18 | self [MyNumber] | semmle.label | self [MyNumber] |
| main.rs:42:13:42:38 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
| main.rs:42:32:42:37 | number | semmle.label | number |
| main.rs:58:9:58:17 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
| main.rs:58:21:58:50 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
| main.rs:58:40:58:49 | source(...) | semmle.label | source(...) |
| main.rs:59:10:59:18 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
| main.rs:59:10:59:30 | my_number.to_number(...) | semmle.label | my_number.to_number(...) |
| main.rs:49:18:49:21 | SelfParam [MyNumber] | semmle.label | SelfParam [MyNumber] |
| main.rs:49:31:55:5 | { ... } | semmle.label | { ... } |
| main.rs:50:15:50:18 | self [MyNumber] | semmle.label | self [MyNumber] |
| main.rs:51:13:51:38 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
| main.rs:51:32:51:37 | number | semmle.label | number |
| main.rs:67:9:67:17 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
| main.rs:67:21:67:50 | ...::MyNumber(...) [MyNumber] | semmle.label | ...::MyNumber(...) [MyNumber] |
| main.rs:67:40:67:49 | source(...) | semmle.label | source(...) |
| main.rs:68:10:68:18 | my_number [MyNumber] | semmle.label | my_number [MyNumber] |
| main.rs:68:10:68:30 | my_number.to_number(...) | semmle.label | my_number.to_number(...) |
subpaths
| main.rs:59:10:59:18 | my_number [MyNumber] | main.rs:40:18:40:21 | SelfParam [MyNumber] | main.rs:40:31:46:5 | { ... } | main.rs:59:10:59:30 | my_number.to_number(...) |
| main.rs:68:10:68:18 | my_number [MyNumber] | main.rs:49:18:49:21 | SelfParam [MyNumber] | main.rs:49:31:55:5 | { ... } | main.rs:68:10:68:30 | my_number.to_number(...) |
testFailures
| main.rs:78:35:78:54 | //... | Missing result: hasValueFlow=40 |
#select
| main.rs:16:10:16:10 | c | main.rs:13:13:13:22 | source(...) | main.rs:16:10:16:10 | c | $@ | main.rs:13:13:13:22 | source(...) | source(...) |
| main.rs:59:10:59:30 | my_number.to_number(...) | main.rs:58:40:58:49 | source(...) | main.rs:59:10:59:30 | my_number.to_number(...) | $@ | main.rs:58:40:58:49 | source(...) | source(...) |
| main.rs:68:10:68:30 | my_number.to_number(...) | main.rs:67:40:67:49 | source(...) | main.rs:68:10:68:30 | my_number.to_number(...) | $@ | main.rs:67:40:67:49 | source(...) | source(...) |

View File

@@ -1,5 +1,5 @@
// -----------------------------------------------------------------------------
// Data flow through pointers.
// Data flow through borrows and pointers.
fn source(i: i64) -> i64 {
1000 + i
@@ -32,6 +32,15 @@ fn write_and_read_through_borrow() {
sink(*b); // $ MISSING: hasValueFlow=37
}
fn takes_borrowed_value(&n: &i64) {
sink(n); // $ MISSING: hasValueFlow=83
}
fn pass_borrowed_value() {
let val = source(83);
takes_borrowed_value(&val);
}
enum MyNumber {
MyNumber(i64)
}
@@ -47,8 +56,8 @@ impl MyNumber {
fn get_number(&self) -> i64 {
match self {
MyNumber::MyNumber(number) => {
*number
&MyNumber::MyNumber(number) => {
number
}
}
}
@@ -69,11 +78,33 @@ fn through_self_in_method_explicit_borrow() {
sink(my_number.get_number()); // $ MISSING: hasValueFlow=40
}
fn ref_nested_pattern_match() {
let a = &(source(23), 1);
// Match "in order", ref then tuple
let b = match a {
&(n, _) => n
};
sink(b); // $ MISSING: hasValueFlow=23
// Match "out of order", tuple then ref
let c = match a {
(n, _) => {
match n {
&i => i
}
}
};
sink(c); // $ MISSING: hasValueFlow=23
}
fn main() {
read_through_borrow();
write_through_borrow();
write_and_read_through_borrow();
pass_borrowed_value();
through_self_in_method_no_borrow();
through_self_in_method_implicit_borrow();
through_self_in_method_explicit_borrow();
ref_nested_pattern_match();
}