mirror of
https://github.com/github/codeql.git
synced 2026-04-26 01:05:15 +02:00
Rust: Add data flow tests for borrows
This commit is contained in:
@@ -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(...) |
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user