From dfd1865b969cd12558e9e70fa95ccea9a816b617 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 17 Jan 2025 12:27:02 +0000 Subject: [PATCH] Rust: Add some basic flow models. --- .../frameworks/stdlib/lang-core.model.yml | 13 ++++ .../dataflow/local/DataFlowStep.expected | 65 +++++++++++++++---- .../dataflow/local/inline-flow.expected | 33 ++++++++++ .../test/library-tests/dataflow/local/main.rs | 6 +- .../library-tests/dataflow/sources/test.rs | 8 +-- 5 files changed, 104 insertions(+), 21 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml index d4712c8802f..a0639a662d1 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml @@ -11,10 +11,23 @@ extensions: - ["lang:core", "::unwrap", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"] - ["lang:core", "::unwrap_or", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"] - ["lang:core", "::unwrap_or", "Argument[0]", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_or_default", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_or_else", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_or_else", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_unchecked", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::expect", "Argument[self].Variant[crate::option::Option::Some(0)]", "ReturnValue", "value", "manual"] # Result - ["lang:core", "::unwrap", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"] - ["lang:core", "::unwrap_or", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"] - ["lang:core", "::unwrap_or", "Argument[0]", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_or_default", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_or_else", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_or_else", "Argument[0].ReturnValue", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_unchecked", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_err", "Argument[self].Variant[crate::result::Result::Err(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::unwrap_err_unchecked", "Argument[self].Variant[crate::result::Result::Err(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::expect", "Argument[self].Variant[crate::result::Result::Ok(0)]", "ReturnValue", "value", "manual"] + - ["lang:core", "::expect_err", "Argument[self].Variant[crate::result::Result::Err(0)]", "ReturnValue", "value", "manual"] # String - ["lang:alloc", "::as_str", "Argument[self]", "ReturnValue", "taint", "manual"] - ["lang:alloc", "::as_bytes", "Argument[self]", "ReturnValue", "taint", "manual"] diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 28edc1e940e..79bfd4bc05b 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -1,11 +1,24 @@ localStep -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::unwrap_or | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or | MaD:3 | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::unwrap_or | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or | MaD:6 | -| file://:0:0:0:0 | [summary param] 0 in lang:core::_::crate::hint::must_use | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::crate::hint::must_use | MaD:8 | -| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap | MaD:2 | -| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or | MaD:4 | -| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap | MaD:5 | -| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or | MaD:7 | +| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::unwrap_or | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or | MaD:4 | +| file://:0:0:0:0 | [summary param] 0 in lang:core::_::::unwrap_or | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or | MaD:15 | +| file://:0:0:0:0 | [summary param] 0 in lang:core::_::crate::hint::must_use | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::crate::hint::must_use | MaD:21 | +| file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::unwrap_or_else | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or_else | MaD:7 | +| file://:0:0:0:0 | [summary] read: Argument[0].ReturnValue in lang:core::_::::unwrap_or_else | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or_else | MaD:18 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::expect | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::expect | MaD:2 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap | MaD:3 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or | MaD:5 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or_default | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or_default | MaD:6 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or_else | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or_else | MaD:8 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_unchecked | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_unchecked | MaD:9 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Err(0)] in lang:core::_::::expect_err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::expect_err | MaD:11 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Err(0)] in lang:core::_::::unwrap_err | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_err | MaD:13 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Err(0)] in lang:core::_::::unwrap_err_unchecked | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_err_unchecked | MaD:14 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::expect | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::expect | MaD:10 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap | MaD:12 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or | MaD:16 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or_default | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or_default | MaD:17 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or_else | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_or_else | MaD:19 | +| file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_unchecked | file://:0:0:0:0 | [summary] to write: ReturnValue in lang:core::_::::unwrap_unchecked | MaD:20 | | main.rs:3:11:3:11 | [SSA] i | main.rs:4:12:4:12 | i | | | main.rs:3:11:3:11 | i | main.rs:3:11:3:11 | [SSA] i | | | main.rs:3:11:3:16 | ...: i64 | main.rs:3:11:3:11 | i | | @@ -486,13 +499,26 @@ localStep | main.rs:466:36:466:41 | ...::new(...) | main.rs:466:36:466:41 | MacroExpr | | models | 1 | Sink: lang:std; crate::io::stdio::_print; log-injection; Argument[0] | -| 2 | Summary: lang:core; ::unwrap; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | -| 3 | Summary: lang:core; ::unwrap_or; Argument[0]; ReturnValue; value | -| 4 | Summary: lang:core; ::unwrap_or; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | -| 5 | Summary: lang:core; ::unwrap; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | -| 6 | Summary: lang:core; ::unwrap_or; Argument[0]; ReturnValue; value | -| 7 | Summary: lang:core; ::unwrap_or; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | -| 8 | Summary: lang:core; crate::hint::must_use; Argument[0]; ReturnValue; value | +| 2 | Summary: lang:core; ::expect; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 3 | Summary: lang:core; ::unwrap; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 4 | Summary: lang:core; ::unwrap_or; Argument[0]; ReturnValue; value | +| 5 | Summary: lang:core; ::unwrap_or; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 6 | Summary: lang:core; ::unwrap_or_default; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 7 | Summary: lang:core; ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | +| 8 | Summary: lang:core; ::unwrap_or_else; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 9 | Summary: lang:core; ::unwrap_unchecked; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 10 | Summary: lang:core; ::expect; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | +| 11 | Summary: lang:core; ::expect_err; Argument[self].Variant[crate::result::Result::Err(0)]; ReturnValue; value | +| 12 | Summary: lang:core; ::unwrap; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | +| 13 | Summary: lang:core; ::unwrap_err; Argument[self].Variant[crate::result::Result::Err(0)]; ReturnValue; value | +| 14 | Summary: lang:core; ::unwrap_err_unchecked; Argument[self].Variant[crate::result::Result::Err(0)]; ReturnValue; value | +| 15 | Summary: lang:core; ::unwrap_or; Argument[0]; ReturnValue; value | +| 16 | Summary: lang:core; ::unwrap_or; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | +| 17 | Summary: lang:core; ::unwrap_or_default; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | +| 18 | Summary: lang:core; ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | +| 19 | Summary: lang:core; ::unwrap_or_else; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | +| 20 | Summary: lang:core; ::unwrap_unchecked; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | +| 21 | Summary: lang:core; crate::hint::must_use; Argument[0]; ReturnValue; value | storeStep | file://:0:0:0:0 | [summary] to write: ReturnValue.Variant[crate::result::Result::Ok(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::bytes | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::bytes | | file://:0:0:0:0 | [summary] to write: ReturnValue.Variant[crate::result::Result::Ok(0)] in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::text | Ok | file://:0:0:0:0 | [summary] to write: ReturnValue in repo:https://github.com/seanmonstar/reqwest:reqwest::_::::text | @@ -577,10 +603,21 @@ storeStep | main.rs:414:35:414:61 | default_name | captured default_name | main.rs:414:35:414:61 | \|...\| ... | | main.rs:436:27:436:27 | 0 | Some | main.rs:436:22:436:28 | Some(...) | readStep +| file://:0:0:0:0 | [summary param] self in lang:core::_::::expect | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::expect | | file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap | | file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or_default | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or_default | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or_else | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_or_else | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_unchecked | Some | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::option::Option::Some(0)] in lang:core::_::::unwrap_unchecked | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::expect | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::expect | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::expect_err | Err | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Err(0)] in lang:core::_::::expect_err | | file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_err | Err | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Err(0)] in lang:core::_::::unwrap_err | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_err_unchecked | Err | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Err(0)] in lang:core::_::::unwrap_err_unchecked | | file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or_default | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or_default | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_or_else | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_or_else | +| file://:0:0:0:0 | [summary param] self in lang:core::_::::unwrap_unchecked | Ok | file://:0:0:0:0 | [summary] read: Argument[self].Variant[crate::result::Result::Ok(0)] in lang:core::_::::unwrap_unchecked | | main.rs:33:9:33:15 | Some(...) | Some | main.rs:33:14:33:14 | _ | | main.rs:87:11:87:11 | i | &ref | main.rs:87:10:87:11 | * ... | | main.rs:95:10:95:10 | a | tuple.0 | main.rs:95:10:95:12 | a.0 | diff --git a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected index cde62441663..972b140623f 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected @@ -2,6 +2,9 @@ models | 1 | Summary: lang:core; ::unwrap; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | | 2 | Summary: lang:core; ::unwrap_or; Argument[0]; ReturnValue; value | | 3 | Summary: lang:core; ::unwrap_or; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 4 | Summary: lang:core; ::unwrap_or_else; Argument[self].Variant[crate::option::Option::Some(0)]; ReturnValue; value | +| 5 | Summary: lang:core; ::expect; Argument[self].Variant[crate::result::Result::Ok(0)]; ReturnValue; value | +| 6 | Summary: lang:core; ::expect_err; Argument[self].Variant[crate::result::Result::Err(0)]; ReturnValue; value | edges | main.rs:19:9:19:9 | s | main.rs:20:10:20:10 | s | provenance | | | main.rs:19:13:19:21 | source(...) | main.rs:19:9:19:9 | s | provenance | | @@ -66,6 +69,10 @@ edges | main.rs:229:19:229:28 | source(...) | main.rs:229:14:229:29 | Some(...) [Some] | provenance | | | main.rs:230:10:230:11 | s1 [Some] | main.rs:230:10:230:24 | s1.unwrap_or(...) | provenance | MaD:3 | | main.rs:233:23:233:32 | source(...) | main.rs:233:10:233:33 | s2.unwrap_or(...) | provenance | MaD:2 | +| main.rs:237:9:237:10 | s1 [Some] | main.rs:238:10:238:11 | s1 [Some] | provenance | | +| main.rs:237:14:237:29 | Some(...) [Some] | main.rs:237:9:237:10 | s1 [Some] | provenance | | +| main.rs:237:19:237:28 | source(...) | main.rs:237:14:237:29 | Some(...) [Some] | provenance | | +| main.rs:238:10:238:11 | s1 [Some] | main.rs:238:10:238:32 | s1.unwrap_or_else(...) | provenance | MaD:4 | | main.rs:245:9:245:10 | s1 [Some] | main.rs:247:14:247:15 | s1 [Some] | provenance | | | main.rs:245:14:245:29 | Some(...) [Some] | main.rs:245:9:245:10 | s1 [Some] | provenance | | | main.rs:245:19:245:28 | source(...) | main.rs:245:14:245:29 | Some(...) [Some] | provenance | | @@ -78,6 +85,14 @@ edges | main.rs:257:9:257:10 | i1 | main.rs:259:10:259:11 | i1 | provenance | | | main.rs:257:14:257:15 | s1 [Ok] | main.rs:257:14:257:16 | TryExpr | provenance | | | main.rs:257:14:257:16 | TryExpr | main.rs:257:9:257:10 | i1 | provenance | | +| main.rs:267:9:267:10 | s1 [Ok] | main.rs:268:10:268:11 | s1 [Ok] | provenance | | +| main.rs:267:32:267:45 | Ok(...) [Ok] | main.rs:267:9:267:10 | s1 [Ok] | provenance | | +| main.rs:267:35:267:44 | source(...) | main.rs:267:32:267:45 | Ok(...) [Ok] | provenance | | +| main.rs:268:10:268:11 | s1 [Ok] | main.rs:268:10:268:22 | s1.expect(...) | provenance | MaD:5 | +| main.rs:271:9:271:10 | s2 [Err] | main.rs:273:10:273:11 | s2 [Err] | provenance | | +| main.rs:271:32:271:46 | Err(...) [Err] | main.rs:271:9:271:10 | s2 [Err] | provenance | | +| main.rs:271:36:271:45 | source(...) | main.rs:271:32:271:46 | Err(...) [Err] | provenance | | +| main.rs:273:10:273:11 | s2 [Err] | main.rs:273:10:273:26 | s2.expect_err(...) | provenance | MaD:6 | | main.rs:282:9:282:10 | s1 [A] | main.rs:284:11:284:12 | s1 [A] | provenance | | | main.rs:282:14:282:39 | ...::A(...) [A] | main.rs:282:9:282:10 | s1 [A] | provenance | | | main.rs:282:29:282:38 | source(...) | main.rs:282:14:282:39 | ...::A(...) [A] | provenance | | @@ -235,6 +250,11 @@ nodes | main.rs:230:10:230:24 | s1.unwrap_or(...) | semmle.label | s1.unwrap_or(...) | | main.rs:233:10:233:33 | s2.unwrap_or(...) | semmle.label | s2.unwrap_or(...) | | main.rs:233:23:233:32 | source(...) | semmle.label | source(...) | +| main.rs:237:9:237:10 | s1 [Some] | semmle.label | s1 [Some] | +| main.rs:237:14:237:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:237:19:237:28 | source(...) | semmle.label | source(...) | +| main.rs:238:10:238:11 | s1 [Some] | semmle.label | s1 [Some] | +| main.rs:238:10:238:32 | s1.unwrap_or_else(...) | semmle.label | s1.unwrap_or_else(...) | | main.rs:245:9:245:10 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:245:14:245:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | | main.rs:245:19:245:28 | source(...) | semmle.label | source(...) | @@ -249,6 +269,16 @@ nodes | main.rs:257:14:257:15 | s1 [Ok] | semmle.label | s1 [Ok] | | main.rs:257:14:257:16 | TryExpr | semmle.label | TryExpr | | main.rs:259:10:259:11 | i1 | semmle.label | i1 | +| main.rs:267:9:267:10 | s1 [Ok] | semmle.label | s1 [Ok] | +| main.rs:267:32:267:45 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | +| main.rs:267:35:267:44 | source(...) | semmle.label | source(...) | +| main.rs:268:10:268:11 | s1 [Ok] | semmle.label | s1 [Ok] | +| main.rs:268:10:268:22 | s1.expect(...) | semmle.label | s1.expect(...) | +| main.rs:271:9:271:10 | s2 [Err] | semmle.label | s2 [Err] | +| main.rs:271:32:271:46 | Err(...) [Err] | semmle.label | Err(...) [Err] | +| main.rs:271:36:271:45 | source(...) | semmle.label | source(...) | +| main.rs:273:10:273:11 | s2 [Err] | semmle.label | s2 [Err] | +| main.rs:273:10:273:26 | s2.expect_err(...) | semmle.label | s2.expect_err(...) | | main.rs:282:9:282:10 | s1 [A] | semmle.label | s1 [A] | | main.rs:282:14:282:39 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | | main.rs:282:29:282:38 | source(...) | semmle.label | source(...) | @@ -355,8 +385,11 @@ testFailures | main.rs:225:10:225:20 | s1.unwrap(...) | main.rs:224:19:224:28 | source(...) | main.rs:225:10:225:20 | s1.unwrap(...) | $@ | main.rs:224:19:224:28 | source(...) | source(...) | | main.rs:230:10:230:24 | s1.unwrap_or(...) | main.rs:229:19:229:28 | source(...) | main.rs:230:10:230:24 | s1.unwrap_or(...) | $@ | main.rs:229:19:229:28 | source(...) | source(...) | | main.rs:233:10:233:33 | s2.unwrap_or(...) | main.rs:233:23:233:32 | source(...) | main.rs:233:10:233:33 | s2.unwrap_or(...) | $@ | main.rs:233:23:233:32 | source(...) | source(...) | +| main.rs:238:10:238:32 | s1.unwrap_or_else(...) | main.rs:237:19:237:28 | source(...) | main.rs:238:10:238:32 | s1.unwrap_or_else(...) | $@ | main.rs:237:19:237:28 | source(...) | source(...) | | main.rs:248:10:248:11 | i1 | main.rs:245:19:245:28 | source(...) | main.rs:248:10:248:11 | i1 | $@ | main.rs:245:19:245:28 | source(...) | source(...) | | main.rs:259:10:259:11 | i1 | main.rs:254:35:254:44 | source(...) | main.rs:259:10:259:11 | i1 | $@ | main.rs:254:35:254:44 | source(...) | source(...) | +| main.rs:268:10:268:22 | s1.expect(...) | main.rs:267:35:267:44 | source(...) | main.rs:268:10:268:22 | s1.expect(...) | $@ | main.rs:267:35:267:44 | source(...) | source(...) | +| main.rs:273:10:273:26 | s2.expect_err(...) | main.rs:271:36:271:45 | source(...) | main.rs:273:10:273:26 | s2.expect_err(...) | $@ | main.rs:271:36:271:45 | source(...) | source(...) | | main.rs:285:35:285:35 | n | main.rs:282:29:282:38 | source(...) | main.rs:285:35:285:35 | n | $@ | main.rs:282:29:282:38 | source(...) | source(...) | | main.rs:289:55:289:55 | n | main.rs:282:29:282:38 | source(...) | main.rs:289:55:289:55 | n | $@ | main.rs:282:29:282:38 | source(...) | source(...) | | main.rs:303:22:303:22 | n | main.rs:300:16:300:25 | source(...) | main.rs:303:22:303:22 | n | $@ | main.rs:300:16:300:25 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/local/main.rs b/rust/ql/test/library-tests/dataflow/local/main.rs index 591eecfb835..c4d90f3d728 100644 --- a/rust/ql/test/library-tests/dataflow/local/main.rs +++ b/rust/ql/test/library-tests/dataflow/local/main.rs @@ -235,7 +235,7 @@ fn option_unwrap_or() { fn option_unwrap_or_else() { let s1 = Some(source(47)); - sink(s1.unwrap_or_else(|| 0)); // $ MISSING: hasValueFlow=47 + sink(s1.unwrap_or_else(|| 0)); // $ hasValueFlow=47 let s2 = None; sink(s2.unwrap_or_else(|| source(48))); // $ MISSING: hasValueFlow=48 @@ -265,12 +265,12 @@ fn result_questionmark() -> Result { fn result_expect() { let s1: Result = Ok(source(78)); - sink(s1.expect("")); // $ MISSING: hasValueFlow=78 + sink(s1.expect("")); // $ hasValueFlow=78 sink(s1.expect_err("")); let s2: Result = Err(source(79)); sink(s2.expect("")); - sink(s2.expect_err("")); // $ MISSING: hasValueFlow=79 + sink(s2.expect_err("")); // $ hasValueFlow=79 } enum MyTupleEnum { diff --git a/rust/ql/test/library-tests/dataflow/sources/test.rs b/rust/ql/test/library-tests/dataflow/sources/test.rs index 449828cb995..e867c2961d6 100644 --- a/rust/ql/test/library-tests/dataflow/sources/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/test.rs @@ -11,7 +11,7 @@ fn test_env_vars() { let var1 = std::env::var("HOME").expect("HOME not set"); // $ Alert[rust/summary/taint-sources] let var2 = std::env::var_os("PATH").unwrap(); // $ Alert[rust/summary/taint-sources] - sink(var1); // $ MISSING: hasTaintFlow + sink(var1); // $ hasTaintFlow="HOME" sink(var2); // $ hasTaintFlow="PATH" for (key, value) in std::env::vars() { // $ Alert[rust/summary/taint-sources] @@ -51,9 +51,9 @@ fn test_env_dirs() { let exe = std::env::current_exe().expect("FAILED"); // $ Alert[rust/summary/taint-sources] let home = std::env::home_dir().expect("FAILED"); // $ Alert[rust/summary/taint-sources] - sink(dir); // $ MISSING: hasTaintFlow - sink(exe); // $ MISSING: hasTaintFlow - sink(home); // $ MISSING: hasTaintFlow + sink(dir); // $ hasTaintFlow + sink(exe); // $ hasTaintFlow + sink(home); // $ hasTaintFlow } async fn test_reqwest() -> Result<(), reqwest::Error> {