From bb70bfce4354f7e53c153b239513f6f36c7fd144 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Thu, 21 Nov 2024 13:11:40 +0100 Subject: [PATCH] Rust: Tweak global data flow test and add inline flow test --- .../dataflow/global/inline-flow.expected | 6 ++++ .../dataflow/global/inline-flow.ql | 12 +++++++ .../library-tests/dataflow/global/main.rs | 22 ++++++++---- .../dataflow/global/viableCallable.expected | 35 ++++++++++--------- 4 files changed, 52 insertions(+), 23 deletions(-) create mode 100644 rust/ql/test/library-tests/dataflow/global/inline-flow.expected create mode 100644 rust/ql/test/library-tests/dataflow/global/inline-flow.ql diff --git a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected new file mode 100644 index 00000000000..4e4a41dfc62 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected @@ -0,0 +1,6 @@ +models +edges +nodes +subpaths +testFailures +#select diff --git a/rust/ql/test/library-tests/dataflow/global/inline-flow.ql b/rust/ql/test/library-tests/dataflow/global/inline-flow.ql new file mode 100644 index 00000000000..ad553fe548d --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/global/inline-flow.ql @@ -0,0 +1,12 @@ +/** + * @kind path-problem + */ + +import rust +import utils.InlineFlowTest +import DefaultFlowTest +import ValueFlow::PathGraph + +from ValueFlow::PathNode source, ValueFlow::PathNode sink +where ValueFlow::flowPath(source, sink) +select sink, source, sink, "$@", source, source.toString() diff --git a/rust/ql/test/library-tests/dataflow/global/main.rs b/rust/ql/test/library-tests/dataflow/global/main.rs index eb3a5985692..730ddd3cf4a 100644 --- a/rust/ql/test/library-tests/dataflow/global/main.rs +++ b/rust/ql/test/library-tests/dataflow/global/main.rs @@ -15,11 +15,11 @@ fn get_data(n: i64) -> i64 { fn data_out_of_call() { let a = get_data(7); - sink(a); // $ hasValueFlow=n + sink(a); // $ MISSING: hasValueFlow=n } fn data_in(n: i64) { - sink(n + 7); // $ hasValueFlow + sink(n); // $ MISSING: hasValueFlow=3 } fn data_in_to_call() { @@ -34,7 +34,15 @@ fn pass_through(i: i64) -> i64 { fn data_through_call() { let a = source(1); let b = pass_through(a); - sink(b); // $ hasValueFlow=1 + sink(b); // $ MISSING: hasValueFlow=1 +} + +fn block_expression_as_argument() { + let a = pass_through({ + println!("Hello"); + source(14) + }); + sink(a); // $ MISSING: hasValueFlow=14 } // ----------------------------------------------------------------------------- @@ -46,7 +54,7 @@ struct MyFlag { impl MyFlag { fn data_in(&self, n: i64) { - sink(n); // $ hasValueFlow=1 + sink(n); // $ MISSING: hasValueFlow=1 } fn get_data(&self) -> i64 { if self.flag { @@ -67,7 +75,7 @@ impl MyFlag { fn data_out_of_method() { let mn = MyFlag { flag: true }; let a = mn.get_data(); - sink(a); + sink(a); // $ MISSING: hasValueFlow=2 } fn data_in_to_method_call() { @@ -79,8 +87,8 @@ fn data_in_to_method_call() { fn data_through_method() { let mn = MyFlag { flag: true }; let a = source(4); - mn.data_through(a); - sink(a); // $ hasValueFlow=4 + let b = mn.data_through(a); + sink(b); // $ MISSING: hasValueFlow=4 } fn main() { diff --git a/rust/ql/test/library-tests/dataflow/global/viableCallable.expected b/rust/ql/test/library-tests/dataflow/global/viableCallable.expected index 6a15bb25249..3a1db5acf22 100644 --- a/rust/ql/test/library-tests/dataflow/global/viableCallable.expected +++ b/rust/ql/test/library-tests/dataflow/global/viableCallable.expected @@ -1,24 +1,27 @@ | main.rs:13:5:13:13 | CallExpr | main.rs:1:1:3:1 | source | | main.rs:17:13:17:23 | CallExpr | main.rs:12:1:14:1 | get_data | | main.rs:18:5:18:11 | CallExpr | main.rs:5:1:7:1 | sink | -| main.rs:22:5:22:15 | CallExpr | main.rs:5:1:7:1 | sink | +| main.rs:22:5:22:11 | CallExpr | main.rs:5:1:7:1 | sink | | main.rs:26:13:26:21 | CallExpr | main.rs:1:1:3:1 | source | | main.rs:27:5:27:14 | CallExpr | main.rs:21:1:23:1 | data_in | | main.rs:35:13:35:21 | CallExpr | main.rs:1:1:3:1 | source | | main.rs:36:13:36:27 | CallExpr | main.rs:30:1:32:1 | pass_through | | main.rs:37:5:37:11 | CallExpr | main.rs:5:1:7:1 | sink | -| main.rs:49:9:49:15 | CallExpr | main.rs:5:1:7:1 | sink | -| main.rs:55:13:55:21 | CallExpr | main.rs:1:1:3:1 | source | -| main.rs:69:13:69:25 | ... .get_data(...) | main.rs:51:5:57:5 | get_data | -| main.rs:70:5:70:11 | CallExpr | main.rs:5:1:7:1 | sink | -| main.rs:75:13:75:21 | CallExpr | main.rs:1:1:3:1 | source | -| main.rs:76:5:76:17 | ... .data_in(...) | main.rs:48:5:50:5 | data_in | -| main.rs:81:13:81:21 | CallExpr | main.rs:1:1:3:1 | source | -| main.rs:82:5:82:22 | ... .data_through(...) | main.rs:58:5:64:5 | data_through | -| main.rs:83:5:83:11 | CallExpr | main.rs:5:1:7:1 | sink | -| main.rs:87:5:87:22 | CallExpr | main.rs:16:1:19:1 | data_out_of_call | -| main.rs:88:5:88:21 | CallExpr | main.rs:25:1:28:1 | data_in_to_call | -| main.rs:89:5:89:23 | CallExpr | main.rs:34:1:38:1 | data_through_call | -| main.rs:91:5:91:24 | CallExpr | main.rs:67:1:71:1 | data_out_of_method | -| main.rs:92:5:92:28 | CallExpr | main.rs:73:1:77:1 | data_in_to_method_call | -| main.rs:93:5:93:25 | CallExpr | main.rs:79:1:84:1 | data_through_method | +| main.rs:41:13:44:6 | CallExpr | main.rs:30:1:32:1 | pass_through | +| main.rs:43:9:43:18 | CallExpr | main.rs:1:1:3:1 | source | +| main.rs:45:5:45:11 | CallExpr | main.rs:5:1:7:1 | sink | +| main.rs:57:9:57:15 | CallExpr | main.rs:5:1:7:1 | sink | +| main.rs:63:13:63:21 | CallExpr | main.rs:1:1:3:1 | source | +| main.rs:77:13:77:25 | ... .get_data(...) | main.rs:59:5:65:5 | get_data | +| main.rs:78:5:78:11 | CallExpr | main.rs:5:1:7:1 | sink | +| main.rs:83:13:83:21 | CallExpr | main.rs:1:1:3:1 | source | +| main.rs:84:5:84:17 | ... .data_in(...) | main.rs:56:5:58:5 | data_in | +| main.rs:89:13:89:21 | CallExpr | main.rs:1:1:3:1 | source | +| main.rs:90:13:90:30 | ... .data_through(...) | main.rs:66:5:72:5 | data_through | +| main.rs:91:5:91:11 | CallExpr | main.rs:5:1:7:1 | sink | +| main.rs:95:5:95:22 | CallExpr | main.rs:16:1:19:1 | data_out_of_call | +| main.rs:96:5:96:21 | CallExpr | main.rs:25:1:28:1 | data_in_to_call | +| main.rs:97:5:97:23 | CallExpr | main.rs:34:1:38:1 | data_through_call | +| main.rs:99:5:99:24 | CallExpr | main.rs:75:1:79:1 | data_out_of_method | +| main.rs:100:5:100:28 | CallExpr | main.rs:81:1:85:1 | data_in_to_method_call | +| main.rs:101:5:101:25 | CallExpr | main.rs:87:1:92:1 | data_through_method |