From 3dfc06ae7c01cb68adf4536ac7652ca402cb4d85 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 28 Oct 2026 14:12:50 +0100 Subject: [PATCH] Rust: Add data flow test for `?` in a closure --- .../dataflow/lambdas/inline-flow.expected | 13 +++++++++++++ rust/ql/test/library-tests/dataflow/lambdas/main.rs | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.expected b/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.expected index 6b9075dd7b0e..58f24c7979a7 100644 --- a/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/lambdas/inline-flow.expected @@ -1,4 +1,5 @@ models +| 1 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | edges | main.rs:10:20:10:52 | if cond {...} else {...} | main.rs:11:10:11:16 | f(...) | provenance | | | main.rs:10:30:10:39 | source(...) | main.rs:10:20:10:52 | if cond {...} else {...} | provenance | | @@ -71,6 +72,11 @@ edges | main.rs:135:14:135:19 | future [captured data] | main.rs:135:14:135:25 | await future | provenance | | | main.rs:141:9:143:9 | [post] { ... } : ... => .. [captured captured] | main.rs:145:14:145:21 | captured | provenance | | | main.rs:142:24:142:34 | source(...) | main.rs:141:9:143:9 | [post] { ... } : ... => .. [captured captured] | provenance | | +| main.rs:172:16:172:40 | TryExpr [Some] | main.rs:173:10:173:12 | f(...) [Some] | provenance | | +| main.rs:172:17:172:38 | Some(...) [Some, Some] | main.rs:172:16:172:40 | TryExpr [Some] | provenance | | +| main.rs:172:22:172:37 | Some(...) [Some] | main.rs:172:17:172:38 | Some(...) [Some, Some] | provenance | | +| main.rs:172:27:172:36 | source(...) | main.rs:172:22:172:37 | Some(...) [Some] | provenance | | +| main.rs:173:10:173:12 | f(...) [Some] | main.rs:173:10:173:21 | ... .unwrap() | provenance | MaD:1 | nodes | main.rs:10:20:10:52 | if cond {...} else {...} | semmle.label | if cond {...} else {...} | | main.rs:10:30:10:39 | source(...) | semmle.label | source(...) | @@ -158,6 +164,12 @@ nodes | main.rs:141:9:143:9 | [post] { ... } : ... => .. [captured captured] | semmle.label | [post] { ... } : ... => .. [captured captured] | | main.rs:142:24:142:34 | source(...) | semmle.label | source(...) | | main.rs:145:14:145:21 | captured | semmle.label | captured | +| main.rs:172:16:172:40 | TryExpr [Some] | semmle.label | TryExpr [Some] | +| main.rs:172:17:172:38 | Some(...) [Some, Some] | semmle.label | Some(...) [Some, Some] | +| main.rs:172:22:172:37 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:172:27:172:36 | source(...) | semmle.label | source(...) | +| main.rs:173:10:173:12 | f(...) [Some] | semmle.label | f(...) [Some] | +| main.rs:173:10:173:21 | ... .unwrap() | semmle.label | ... .unwrap() | subpaths | main.rs:29:21:29:21 | a | main.rs:27:20:27:23 | ... | main.rs:27:26:27:52 | if cond {...} else {...} | main.rs:29:13:29:22 | f(...) | | main.rs:77:21:77:21 | a | main.rs:66:24:66:32 | ...: i64 | main.rs:66:42:72:1 | { ... } | main.rs:77:13:77:22 | f(...) | @@ -186,3 +198,4 @@ testFailures | main.rs:127:18:127:21 | data | main.rs:125:20:125:30 | source(...) | main.rs:127:18:127:21 | data | $@ | main.rs:125:20:125:30 | source(...) | source(...) | | main.rs:135:14:135:25 | await future | main.rs:133:20:133:30 | source(...) | main.rs:135:14:135:25 | await future | $@ | main.rs:133:20:133:30 | source(...) | source(...) | | main.rs:145:14:145:21 | captured | main.rs:142:24:142:34 | source(...) | main.rs:145:14:145:21 | captured | $@ | main.rs:142:24:142:34 | source(...) | source(...) | +| main.rs:173:10:173:21 | ... .unwrap() | main.rs:172:27:172:36 | source(...) | main.rs:173:10:173:21 | ... .unwrap() | $@ | main.rs:172:27:172:36 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/lambdas/main.rs b/rust/ql/test/library-tests/dataflow/lambdas/main.rs index 650734bdd149..f4a4a9ff0459 100644 --- a/rust/ql/test/library-tests/dataflow/lambdas/main.rs +++ b/rust/ql/test/library-tests/dataflow/lambdas/main.rs @@ -168,6 +168,11 @@ mod async_blocks { } } +fn closure_flow_out_try() { + let f = || (Some(Some(source(93))))?; + sink(f().unwrap()); // $ hasValueFlow=93 +} + fn main() { closure_flow_out(); closure_flow_in();