From 31b0d3eb1dc6440746ef4c2f9e778fbeac572553 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 8 Jan 2026 10:57:35 +0100 Subject: [PATCH 1/5] Rust: Fix some models in `fs.model.yml` --- .../rust/frameworks/stdlib/fs.model.yml | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/fs.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/fs.model.yml index 8be4fdc05bf9..6216f79ea858 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/fs.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/fs.model.yml @@ -59,27 +59,25 @@ extensions: - ["std::fs::canonicalize", "Argument[0].OptionalStep[normalize-path]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["std::fs::canonicalize", "Argument[0].OptionalBarrier[normalize-path]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::as_path", "Argument[self].Reference", "ReturnValue.Reference", "value", "manual"] - - ["::as_mut_os_string", "Argument[Self].Reference", "ReturnValue.Reference", "value", "manual"] - - ["::into_os_string", "Argument[Self]", "ReturnValue", "value", "manual"] - - ["::into_boxed_path", "Argument[Self]", "ReturnValue.Reference", "value", "manual"] + - ["::into_boxed_path", "Argument[self]", "ReturnValue.Field[alloc::boxed::Box(0)]", "taint", "manual"] - ["::new", "Argument[0].Reference", "ReturnValue.Reference", "value", "manual"] - ["::join", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::join", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["::as_os_string", "Argument[Self].Reference", "ReturnValue.Reference", "value", "manual"] - - ["::as_mut_os_string", "Argument[Self].Reference", "ReturnValue.Reference", "value", "manual"] + - ["::as_os_str", "Argument[self].Reference.Field[std::path::Path::inner]", "ReturnValue.Reference", "value", "manual"] + - ["::as_mut_os_str", "Argument[self].Reference.Field[std::path::Path::inner]", "ReturnValue.Reference", "value", "manual"] - ["::canonicalize", "Argument[self].Reference.OptionalStep[normalize-path]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::canonicalize", "Argument[self].Reference.OptionalBarrier[normalize-path]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["::extension", "Argument[Self].Reference", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "taint", "manual"] - - ["::file_name", "Argument[Self].Reference", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "taint", "manual"] - - ["::file_prefix", "Argument[Self].Reference", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "taint", "manual"] - - ["::file_stem", "Argument[Self].Reference", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "taint", "manual"] - - ["::into_path_buf", "Argument[Self].Reference", "ReturnValue", "value", "manual"] - - ["::parent", "Argument[Self].Reference", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "taint", "manual"] - - ["::to_path_buf", "Argument[Self].Reference", "ReturnValue", "value", "manual"] - - ["::to_str", "Argument[Self].Reference", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "value", "manual"] - - ["::with_added_extension", "Argument[Self].Reference", "ReturnValue", "taint", "manual"] - - ["::with_extension", "Argument[Self].Reference", "ReturnValue", "taint", "manual"] - - ["::with_file_name", "Argument[Self].Reference", "ReturnValue", "taint", "manual"] + - ["::extension", "Argument[self].Reference", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "taint", "manual"] + - ["::file_name", "Argument[self].Reference", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "taint", "manual"] + - ["::file_prefix", "Argument[self].Reference", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "taint", "manual"] + - ["::file_stem", "Argument[self].Reference", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "taint", "manual"] + - ["::into_path_buf", "Argument[self].Field[alloc::boxed::Box(0)]", "ReturnValue", "value", "manual"] + - ["::parent", "Argument[self].Reference", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "taint", "manual"] + - ["::to_path_buf", "Argument[self].Reference", "ReturnValue", "value", "manual"] + - ["::to_str", "Argument[self].Reference", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "value", "manual"] + - ["::with_added_extension", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::with_extension", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::with_file_name", "Argument[self].Reference", "ReturnValue", "taint", "manual"] - ["::with_file_name", "Argument[0]", "ReturnValue", "taint", "manual"] - ["::accessed", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::created", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] From 792908586aec71a17576e5198726f4d7d3691ca2 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 8 Jan 2026 13:51:16 +0100 Subject: [PATCH 2/5] Rust: Add some `ffi` models --- rust/ql/lib/codeql/rust/frameworks/stdlib/ffi.model.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 rust/ql/lib/codeql/rust/frameworks/stdlib/ffi.model.yml diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/ffi.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/ffi.model.yml new file mode 100644 index 000000000000..0f7545f8a924 --- /dev/null +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/ffi.model.yml @@ -0,0 +1,8 @@ +extensions: + - addsTo: + pack: codeql/rust-all + extensible: summaryModel + data: + - ["::to_str", "Argument[self].Reference.Field[std::ffi::os_str::OsStr::inner]", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "taint", "manual"] + - ["::to_string_lossy", "Argument[self].Reference.Field[std::ffi::os_str::OsStr::inner]", "ReturnValue.Field[alloc::borrow::Cow::Owned(0)]", "taint", "manual"] + - ["::as_encoded_bytes", "Argument[self].Reference.Field[std::ffi::os_str::OsStr::inner]", "ReturnValue.Reference", "taint", "manual"] \ No newline at end of file From 0d0029f5a3d836b01880c8d85b5f6fc92d246075 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 8 Jan 2026 13:54:15 +0100 Subject: [PATCH 3/5] Rust: Update expected test output --- .../dataflow/sources/file/InlineFlow.expected | 994 ++++++++++-------- .../sources/file/TaintSources.expected | 60 +- .../dataflow/sources/file/test.rs | 54 +- 3 files changed, 600 insertions(+), 508 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected index 6ed7d5dafb96..c7413e3c28f0 100644 --- a/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected @@ -35,9 +35,14 @@ models | 34 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | | 35 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | | 36 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 37 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 38 | Summary: ::into_string; Argument[self].Field[std::ffi::os_str::OsString::inner].Field[std::sys::os_str::bytes::Buf::inner]; ReturnValue.Field[core::result::Result::Ok(0)].Field[alloc::string::String::vec]; value | -| 39 | Summary: ::as_path; Argument[self].Reference; ReturnValue.Reference; value | +| 37 | Summary: ::to_mut; Argument[self].Reference.Field[alloc::borrow::Cow::Owned(0)]; ReturnValue.Reference; value | +| 38 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 39 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 40 | Summary: ::into_string; Argument[self].Field[std::ffi::os_str::OsString::inner].Field[std::sys::os_str::bytes::Buf::inner]; ReturnValue.Field[core::result::Result::Ok(0)].Field[alloc::string::String::vec]; value | +| 41 | Summary: ::from; Argument[0]; ReturnValue.Field[std::path::PathBuf::inner]; value | +| 42 | Summary: ::as_path; Argument[self].Reference; ReturnValue.Reference; value | +| 43 | Summary: ::into_boxed_path; Argument[self]; ReturnValue.Field[alloc::boxed::Box(0)]; taint | +| 44 | Summary: ::into_os_string; Argument[self].Field[std::path::PathBuf::inner]; ReturnValue; value | edges | test.rs:12:13:12:18 | buffer | test.rs:13:14:13:19 | buffer | provenance | | | test.rs:12:31:12:43 | ...::read | test.rs:12:31:12:55 | ...::read(...) [Ok] | provenance | Src:MaD:11 | @@ -51,213 +56,245 @@ edges | test.rs:22:22:22:39 | ...::read_to_string | test.rs:22:22:22:51 | ...::read_to_string(...) [Ok] | provenance | Src:MaD:13 | | test.rs:22:22:22:51 | ...::read_to_string(...) [Ok] | test.rs:22:22:22:52 | TryExpr | provenance | | | test.rs:22:22:22:52 | TryExpr | test.rs:22:13:22:18 | buffer | provenance | | -| test.rs:29:13:29:16 | path | test.rs:30:14:30:17 | path | provenance | | -| test.rs:29:13:29:16 | path | test.rs:31:14:31:17 | path | provenance | | -| test.rs:29:13:29:16 | path | test.rs:40:14:40:17 | path | provenance | | -| test.rs:29:13:29:16 | path | test.rs:41:14:41:17 | path | provenance | | -| test.rs:29:20:29:27 | e.path() | test.rs:29:13:29:16 | path | provenance | | -| test.rs:29:22:29:25 | path | test.rs:29:20:29:27 | e.path() | provenance | Src:MaD:4 MaD:4 | -| test.rs:30:14:30:17 | path | test.rs:30:14:30:25 | path.clone() | provenance | MaD:18 | +| test.rs:30:13:30:16 | path | test.rs:31:14:31:17 | path | provenance | | +| test.rs:30:13:30:16 | path | test.rs:32:14:32:17 | path | provenance | | +| test.rs:30:13:30:16 | path | test.rs:33:14:33:17 | path | provenance | | +| test.rs:30:13:30:16 | path | test.rs:34:39:34:42 | path | provenance | | +| test.rs:30:13:30:16 | path | test.rs:35:14:35:17 | path | provenance | | +| test.rs:30:13:30:16 | path | test.rs:36:14:36:17 | path | provenance | | +| test.rs:30:13:30:16 | path | test.rs:37:14:37:17 | path | provenance | | +| test.rs:30:13:30:16 | path | test.rs:38:14:38:17 | path | provenance | | +| test.rs:30:13:30:16 | path | test.rs:39:14:39:17 | path | provenance | | +| test.rs:30:13:30:16 | path | test.rs:40:14:40:17 | path | provenance | | +| test.rs:30:13:30:16 | path | test.rs:41:14:41:17 | path | provenance | | +| test.rs:30:13:30:16 | path | test.rs:42:14:42:17 | path | provenance | | +| test.rs:30:20:30:27 | e.path() | test.rs:30:13:30:16 | path | provenance | | +| test.rs:30:22:30:25 | path | test.rs:30:20:30:27 | e.path() | provenance | Src:MaD:4 MaD:4 | | test.rs:31:14:31:17 | path | test.rs:31:14:31:25 | path.clone() | provenance | MaD:18 | -| test.rs:31:14:31:25 | path.clone() | test.rs:31:14:31:35 | ... .as_path() | provenance | MaD:39 | -| test.rs:40:14:40:17 | path | test.rs:40:14:40:32 | path.canonicalize() [Ok] | provenance | MaD:19 | -| test.rs:40:14:40:32 | path.canonicalize() [Ok] | test.rs:40:14:40:41 | ... .unwrap() | provenance | MaD:37 | -| test.rs:43:13:43:21 | file_name | test.rs:44:14:44:22 | file_name | provenance | | -| test.rs:43:13:43:21 | file_name | test.rs:45:14:45:22 | file_name | provenance | | -| test.rs:43:13:43:21 | file_name | test.rs:49:14:49:22 | file_name | provenance | | -| test.rs:43:25:43:37 | e.file_name() | test.rs:43:13:43:21 | file_name | provenance | | -| test.rs:43:27:43:35 | file_name | test.rs:43:25:43:37 | e.file_name() | provenance | Src:MaD:3 MaD:3 | -| test.rs:44:14:44:22 | file_name | test.rs:44:14:44:30 | file_name.clone() | provenance | MaD:18 | +| test.rs:32:14:32:17 | path | test.rs:32:14:32:25 | path.clone() | provenance | MaD:18 | +| test.rs:32:14:32:25 | path.clone() | test.rs:32:14:32:35 | ... .as_path() | provenance | MaD:42 | +| test.rs:33:14:33:17 | path | test.rs:33:14:33:25 | path.clone() | provenance | MaD:18 | +| test.rs:33:14:33:25 | path.clone() | test.rs:33:14:33:42 | ... .into_os_string() | provenance | MaD:44 | +| test.rs:34:39:34:42 | path | test.rs:34:39:34:50 | path.clone() | provenance | MaD:18 | +| test.rs:34:39:34:50 | path.clone() | test.rs:34:39:34:68 | ... .into_boxed_path() [Box(0)] | provenance | MaD:43 | +| test.rs:34:39:34:68 | ... .into_boxed_path() [Box(0)] | test.rs:34:14:34:69 | ...::from(...) | provenance | MaD:41 | +| test.rs:35:14:35:17 | path | test.rs:35:14:35:25 | path.clone() | provenance | MaD:18 | +| test.rs:35:14:35:25 | path.clone() | test.rs:35:14:35:37 | ... .as_os_str() | provenance | MaD:19 | +| test.rs:36:14:36:17 | path | test.rs:36:14:36:25 | path.clone() | provenance | MaD:18 | +| test.rs:36:14:36:25 | path.clone() | test.rs:36:14:36:41 | ... .as_mut_os_str() | provenance | MaD:19 | +| test.rs:37:14:37:17 | path | test.rs:37:14:37:26 | path.to_str() | provenance | MaD:19 | +| test.rs:38:14:38:17 | path | test.rs:38:14:38:31 | path.to_path_buf() | provenance | MaD:19 | +| test.rs:39:14:39:17 | path | test.rs:39:14:39:29 | path.file_name() [Some, &ref] | provenance | MaD:19 | +| test.rs:39:14:39:29 | path.file_name() [Some, &ref] | test.rs:39:14:39:38 | ... .unwrap() | provenance | MaD:38 | +| test.rs:40:14:40:17 | path | test.rs:40:14:40:29 | path.extension() [Some, &ref] | provenance | MaD:19 | +| test.rs:40:14:40:29 | path.extension() [Some, &ref] | test.rs:40:14:40:38 | ... .unwrap() | provenance | MaD:38 | +| test.rs:41:14:41:17 | path | test.rs:41:14:41:32 | path.canonicalize() [Ok] | provenance | MaD:19 | +| test.rs:41:14:41:32 | path.canonicalize() [Ok] | test.rs:41:14:41:41 | ... .unwrap() | provenance | MaD:39 | +| test.rs:44:13:44:21 | file_name | test.rs:45:14:45:22 | file_name | provenance | | +| test.rs:44:13:44:21 | file_name | test.rs:46:14:46:22 | file_name | provenance | | +| test.rs:44:13:44:21 | file_name | test.rs:47:14:47:22 | file_name | provenance | | +| test.rs:44:13:44:21 | file_name | test.rs:48:14:48:22 | file_name | provenance | | +| test.rs:44:13:44:21 | file_name | test.rs:49:14:49:22 | file_name | provenance | | +| test.rs:44:13:44:21 | file_name | test.rs:50:14:50:22 | file_name | provenance | | +| test.rs:44:25:44:37 | e.file_name() | test.rs:44:13:44:21 | file_name | provenance | | +| test.rs:44:27:44:35 | file_name | test.rs:44:25:44:37 | e.file_name() | provenance | Src:MaD:3 MaD:3 | | test.rs:45:14:45:22 | file_name | test.rs:45:14:45:30 | file_name.clone() | provenance | MaD:18 | -| test.rs:45:14:45:30 | file_name.clone() | test.rs:45:14:45:44 | ... .into_string() [Ok, String] | provenance | MaD:38 | -| test.rs:45:14:45:44 | ... .into_string() [Ok, String] | test.rs:45:14:45:53 | ... .unwrap() | provenance | MaD:37 | -| test.rs:65:13:65:18 | target | test.rs:66:14:66:19 | target | provenance | | -| test.rs:65:22:65:34 | ...::read_link | test.rs:65:22:65:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:12 | -| test.rs:65:22:65:49 | ...::read_link(...) [Ok] | test.rs:65:22:65:50 | TryExpr | provenance | | -| test.rs:65:22:65:50 | TryExpr | test.rs:65:13:65:18 | target | provenance | | -| test.rs:74:13:74:18 | buffer | test.rs:75:14:75:19 | buffer | provenance | | -| test.rs:74:31:74:45 | ...::read | test.rs:74:31:74:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:14 | -| test.rs:74:31:74:57 | ...::read(...) [future, Ok] | test.rs:74:31:74:63 | await ... [Ok] | provenance | | -| test.rs:74:31:74:63 | await ... [Ok] | test.rs:74:31:74:64 | TryExpr | provenance | | -| test.rs:74:31:74:64 | TryExpr | test.rs:74:13:74:18 | buffer | provenance | | -| test.rs:79:13:79:18 | buffer | test.rs:80:14:80:19 | buffer | provenance | | -| test.rs:79:31:79:45 | ...::read | test.rs:79:31:79:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:14 | -| test.rs:79:31:79:57 | ...::read(...) [future, Ok] | test.rs:79:31:79:63 | await ... [Ok] | provenance | | -| test.rs:79:31:79:63 | await ... [Ok] | test.rs:79:31:79:64 | TryExpr | provenance | | -| test.rs:79:31:79:64 | TryExpr | test.rs:79:13:79:18 | buffer | provenance | | -| test.rs:84:13:84:18 | buffer | test.rs:85:14:85:19 | buffer | provenance | | -| test.rs:84:22:84:46 | ...::read_to_string | test.rs:84:22:84:58 | ...::read_to_string(...) [future, Ok] | provenance | Src:MaD:16 | -| test.rs:84:22:84:58 | ...::read_to_string(...) [future, Ok] | test.rs:84:22:84:64 | await ... [Ok] | provenance | | -| test.rs:84:22:84:64 | await ... [Ok] | test.rs:84:22:84:65 | TryExpr | provenance | | -| test.rs:84:22:84:65 | TryExpr | test.rs:84:13:84:18 | buffer | provenance | | -| test.rs:90:13:90:16 | path | test.rs:92:14:92:17 | path | provenance | | -| test.rs:90:20:90:31 | entry.path() | test.rs:90:13:90:16 | path | provenance | | -| test.rs:90:26:90:29 | path | test.rs:90:20:90:31 | entry.path() | provenance | Src:MaD:10 MaD:10 | -| test.rs:91:13:91:21 | file_name | test.rs:93:14:93:22 | file_name | provenance | | -| test.rs:91:25:91:41 | entry.file_name() | test.rs:91:13:91:21 | file_name | provenance | | -| test.rs:91:31:91:39 | file_name | test.rs:91:25:91:41 | entry.file_name() | provenance | Src:MaD:9 MaD:9 | -| test.rs:97:13:97:18 | target | test.rs:98:14:98:19 | target | provenance | | -| test.rs:97:22:97:41 | ...::read_link | test.rs:97:22:97:56 | ...::read_link(...) [future, Ok] | provenance | Src:MaD:15 | -| test.rs:97:22:97:56 | ...::read_link(...) [future, Ok] | test.rs:97:22:97:62 | await ... [Ok] | provenance | | -| test.rs:97:22:97:62 | await ... [Ok] | test.rs:97:22:97:63 | TryExpr | provenance | | -| test.rs:97:22:97:63 | TryExpr | test.rs:97:13:97:18 | target | provenance | | -| test.rs:107:9:107:16 | mut file | test.rs:111:22:111:25 | file | provenance | | -| test.rs:107:9:107:16 | mut file | test.rs:117:22:117:25 | file | provenance | | -| test.rs:107:9:107:16 | mut file | test.rs:123:22:123:25 | file | provenance | | -| test.rs:107:9:107:16 | mut file | test.rs:129:9:129:12 | file | provenance | | -| test.rs:107:9:107:16 | mut file | test.rs:133:17:133:20 | file | provenance | | -| test.rs:107:20:107:38 | ...::open | test.rs:107:20:107:50 | ...::open(...) [Ok] | provenance | Src:MaD:5 | -| test.rs:107:20:107:50 | ...::open(...) [Ok] | test.rs:107:20:107:51 | TryExpr | provenance | | -| test.rs:107:20:107:51 | TryExpr | test.rs:107:9:107:16 | mut file | provenance | | -| test.rs:111:22:111:25 | file | test.rs:111:32:111:42 | [post] &mut buffer [&ref] | provenance | MaD:23 | -| test.rs:111:32:111:42 | [post] &mut buffer [&ref] | test.rs:111:37:111:42 | [post] buffer | provenance | | -| test.rs:111:37:111:42 | [post] buffer | test.rs:112:15:112:20 | buffer | provenance | | -| test.rs:112:15:112:20 | buffer | test.rs:112:14:112:20 | &buffer | provenance | | -| test.rs:117:22:117:25 | file | test.rs:117:39:117:49 | [post] &mut buffer [&ref] | provenance | MaD:25 | -| test.rs:117:39:117:49 | [post] &mut buffer [&ref] | test.rs:117:44:117:49 | [post] buffer | provenance | | -| test.rs:117:44:117:49 | [post] buffer | test.rs:118:15:118:20 | buffer | provenance | | -| test.rs:118:15:118:20 | buffer | test.rs:118:14:118:20 | &buffer | provenance | | -| test.rs:123:22:123:25 | file | test.rs:123:42:123:52 | [post] &mut buffer [&ref] | provenance | MaD:26 | -| test.rs:123:42:123:52 | [post] &mut buffer [&ref] | test.rs:123:47:123:52 | [post] buffer | provenance | | -| test.rs:123:47:123:52 | [post] buffer | test.rs:124:15:124:20 | buffer | provenance | | -| test.rs:124:15:124:20 | buffer | test.rs:124:14:124:20 | &buffer | provenance | | -| test.rs:129:9:129:12 | file | test.rs:129:25:129:35 | [post] &mut buffer [&ref] | provenance | MaD:24 | -| test.rs:129:25:129:35 | [post] &mut buffer [&ref] | test.rs:129:30:129:35 | [post] buffer | provenance | | -| test.rs:129:30:129:35 | [post] buffer | test.rs:130:15:130:20 | buffer | provenance | | -| test.rs:130:15:130:20 | buffer | test.rs:130:14:130:20 | &buffer | provenance | | -| test.rs:133:17:133:20 | file | test.rs:133:17:133:28 | file.bytes() | provenance | MaD:20 | -| test.rs:133:17:133:28 | file.bytes() | test.rs:134:14:134:17 | byte | provenance | | -| test.rs:140:13:140:18 | mut f1 | test.rs:142:22:142:23 | f1 | provenance | | -| test.rs:140:22:140:63 | ... .open(...) [Ok] | test.rs:140:22:140:72 | ... .unwrap() | provenance | MaD:37 | -| test.rs:140:22:140:72 | ... .unwrap() | test.rs:140:13:140:18 | mut f1 | provenance | | -| test.rs:140:50:140:53 | open | test.rs:140:22:140:63 | ... .open(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:142:22:142:23 | f1 | test.rs:142:30:142:40 | [post] &mut buffer [&ref] | provenance | MaD:23 | -| test.rs:142:30:142:40 | [post] &mut buffer [&ref] | test.rs:142:35:142:40 | [post] buffer | provenance | | -| test.rs:142:35:142:40 | [post] buffer | test.rs:143:15:143:20 | buffer | provenance | | -| test.rs:143:15:143:20 | buffer | test.rs:143:14:143:20 | &buffer | provenance | | -| test.rs:147:13:147:18 | mut f2 | test.rs:149:22:149:23 | f2 | provenance | | -| test.rs:147:22:147:80 | ... .open(...) [Ok] | test.rs:147:22:147:89 | ... .unwrap() | provenance | MaD:37 | -| test.rs:147:22:147:89 | ... .unwrap() | test.rs:147:13:147:18 | mut f2 | provenance | | -| test.rs:147:67:147:70 | open | test.rs:147:22:147:80 | ... .open(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:149:22:149:23 | f2 | test.rs:149:30:149:40 | [post] &mut buffer [&ref] | provenance | MaD:23 | -| test.rs:149:30:149:40 | [post] &mut buffer [&ref] | test.rs:149:35:149:40 | [post] buffer | provenance | | -| test.rs:149:35:149:40 | [post] buffer | test.rs:150:15:150:20 | buffer | provenance | | -| test.rs:150:15:150:20 | buffer | test.rs:150:14:150:20 | &buffer | provenance | | -| test.rs:154:13:154:18 | mut f3 | test.rs:156:22:156:23 | f3 | provenance | | -| test.rs:154:22:154:114 | ... .open(...) [Ok] | test.rs:154:22:154:123 | ... .unwrap() | provenance | MaD:37 | -| test.rs:154:22:154:123 | ... .unwrap() | test.rs:154:13:154:18 | mut f3 | provenance | | -| test.rs:154:101:154:104 | open | test.rs:154:22:154:114 | ... .open(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:156:22:156:23 | f3 | test.rs:156:30:156:40 | [post] &mut buffer [&ref] | provenance | MaD:23 | -| test.rs:156:30:156:40 | [post] &mut buffer [&ref] | test.rs:156:35:156:40 | [post] buffer | provenance | | -| test.rs:156:35:156:40 | [post] buffer | test.rs:157:15:157:20 | buffer | provenance | | -| test.rs:157:15:157:20 | buffer | test.rs:157:14:157:20 | &buffer | provenance | | -| test.rs:164:13:164:17 | file1 | test.rs:166:26:166:30 | file1 | provenance | | -| test.rs:164:21:164:39 | ...::open | test.rs:164:21:164:51 | ...::open(...) [Ok] | provenance | Src:MaD:5 | -| test.rs:164:21:164:51 | ...::open(...) [Ok] | test.rs:164:21:164:52 | TryExpr | provenance | | -| test.rs:164:21:164:52 | TryExpr | test.rs:164:13:164:17 | file1 | provenance | | -| test.rs:165:13:165:17 | file2 | test.rs:166:38:166:42 | file2 | provenance | | -| test.rs:165:21:165:39 | ...::open | test.rs:165:21:165:59 | ...::open(...) [Ok] | provenance | Src:MaD:5 | -| test.rs:165:21:165:59 | ...::open(...) [Ok] | test.rs:165:21:165:60 | TryExpr | provenance | | -| test.rs:165:21:165:60 | TryExpr | test.rs:165:13:165:17 | file2 | provenance | | -| test.rs:166:13:166:22 | mut reader | test.rs:167:9:167:14 | reader | provenance | | -| test.rs:166:26:166:30 | file1 | test.rs:166:26:166:43 | file1.chain(...) | provenance | MaD:22 | -| test.rs:166:26:166:43 | file1.chain(...) | test.rs:166:13:166:22 | mut reader | provenance | | -| test.rs:166:38:166:42 | file2 | test.rs:166:26:166:43 | file1.chain(...) | provenance | MaD:21 | -| test.rs:167:9:167:14 | reader | test.rs:167:31:167:41 | [post] &mut buffer [&ref] | provenance | MaD:26 | -| test.rs:167:31:167:41 | [post] &mut buffer [&ref] | test.rs:167:36:167:41 | [post] buffer | provenance | | -| test.rs:167:36:167:41 | [post] buffer | test.rs:168:15:168:20 | buffer | provenance | | -| test.rs:168:15:168:20 | buffer | test.rs:168:14:168:20 | &buffer | provenance | | -| test.rs:173:13:173:17 | file1 | test.rs:174:26:174:30 | file1 | provenance | | -| test.rs:173:21:173:39 | ...::open | test.rs:173:21:173:51 | ...::open(...) [Ok] | provenance | Src:MaD:5 | -| test.rs:173:21:173:51 | ...::open(...) [Ok] | test.rs:173:21:173:52 | TryExpr | provenance | | -| test.rs:173:21:173:52 | TryExpr | test.rs:173:13:173:17 | file1 | provenance | | -| test.rs:174:13:174:22 | mut reader | test.rs:175:9:175:14 | reader | provenance | | -| test.rs:174:26:174:30 | file1 | test.rs:174:26:174:40 | file1.take(...) | provenance | MaD:27 | -| test.rs:174:26:174:40 | file1.take(...) | test.rs:174:13:174:22 | mut reader | provenance | | -| test.rs:175:9:175:14 | reader | test.rs:175:31:175:41 | [post] &mut buffer [&ref] | provenance | MaD:26 | -| test.rs:175:31:175:41 | [post] &mut buffer [&ref] | test.rs:175:36:175:41 | [post] buffer | provenance | | -| test.rs:175:36:175:41 | [post] buffer | test.rs:176:15:176:20 | buffer | provenance | | -| test.rs:176:15:176:20 | buffer | test.rs:176:14:176:20 | &buffer | provenance | | -| test.rs:185:9:185:16 | mut file | test.rs:189:22:189:25 | file | provenance | | -| test.rs:185:9:185:16 | mut file | test.rs:195:22:195:25 | file | provenance | | -| test.rs:185:9:185:16 | mut file | test.rs:201:22:201:25 | file | provenance | | -| test.rs:185:9:185:16 | mut file | test.rs:207:9:207:12 | file | provenance | | -| test.rs:185:9:185:16 | mut file | test.rs:212:18:212:21 | file | provenance | | -| test.rs:185:9:185:16 | mut file | test.rs:213:18:213:21 | file | provenance | | -| test.rs:185:9:185:16 | mut file | test.rs:214:18:214:21 | file | provenance | | -| test.rs:185:9:185:16 | mut file | test.rs:215:18:215:21 | file | provenance | | -| test.rs:185:9:185:16 | mut file | test.rs:224:9:224:12 | file | provenance | | -| test.rs:185:20:185:40 | ...::open | test.rs:185:20:185:52 | ...::open(...) [future, Ok] | provenance | Src:MaD:7 | -| test.rs:185:20:185:52 | ...::open(...) [future, Ok] | test.rs:185:20:185:58 | await ... [Ok] | provenance | | -| test.rs:185:20:185:58 | await ... [Ok] | test.rs:185:20:185:59 | TryExpr | provenance | | -| test.rs:185:20:185:59 | TryExpr | test.rs:185:9:185:16 | mut file | provenance | | -| test.rs:189:22:189:25 | file | test.rs:189:32:189:42 | [post] &mut buffer [&ref] | provenance | MaD:28 | -| test.rs:189:32:189:42 | [post] &mut buffer [&ref] | test.rs:189:37:189:42 | [post] buffer | provenance | | -| test.rs:189:37:189:42 | [post] buffer | test.rs:190:15:190:20 | buffer | provenance | | -| test.rs:190:15:190:20 | buffer | test.rs:190:14:190:20 | &buffer | provenance | | -| test.rs:195:22:195:25 | file | test.rs:195:39:195:49 | [post] &mut buffer [&ref] | provenance | MaD:34 | -| test.rs:195:39:195:49 | [post] &mut buffer [&ref] | test.rs:195:44:195:49 | [post] buffer | provenance | | -| test.rs:195:44:195:49 | [post] buffer | test.rs:196:15:196:20 | buffer | provenance | | -| test.rs:196:15:196:20 | buffer | test.rs:196:14:196:20 | &buffer | provenance | | -| test.rs:201:22:201:25 | file | test.rs:201:42:201:52 | [post] &mut buffer [&ref] | provenance | MaD:35 | -| test.rs:201:42:201:52 | [post] &mut buffer [&ref] | test.rs:201:47:201:52 | [post] buffer | provenance | | -| test.rs:201:47:201:52 | [post] buffer | test.rs:202:15:202:20 | buffer | provenance | | +| test.rs:46:14:46:22 | file_name | test.rs:46:14:46:30 | file_name.clone() | provenance | MaD:18 | +| test.rs:46:14:46:30 | file_name.clone() | test.rs:46:14:46:44 | ... .into_string() [Ok, String] | provenance | MaD:40 | +| test.rs:46:14:46:44 | ... .into_string() [Ok, String] | test.rs:46:14:46:53 | ... .unwrap() | provenance | MaD:39 | +| test.rs:47:14:47:22 | file_name | test.rs:47:14:47:31 | file_name.to_str() [Some, &ref] | provenance | MaD:19 | +| test.rs:47:14:47:31 | file_name.to_str() [Some, &ref] | test.rs:47:14:47:40 | ... .unwrap() | provenance | MaD:38 | +| test.rs:48:14:48:22 | file_name | test.rs:48:14:48:40 | file_name.to_string_lossy() [Owned] | provenance | MaD:19 | +| test.rs:48:14:48:40 | file_name.to_string_lossy() [Owned] | test.rs:48:14:48:49 | ... .to_mut() | provenance | MaD:37 | +| test.rs:49:14:49:22 | file_name | test.rs:49:14:49:30 | file_name.clone() | provenance | MaD:18 | +| test.rs:49:14:49:30 | file_name.clone() | test.rs:49:14:49:49 | ... .as_encoded_bytes() | provenance | MaD:19 | +| test.rs:68:13:68:18 | target | test.rs:69:14:69:19 | target | provenance | | +| test.rs:68:22:68:34 | ...::read_link | test.rs:68:22:68:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:12 | +| test.rs:68:22:68:49 | ...::read_link(...) [Ok] | test.rs:68:22:68:50 | TryExpr | provenance | | +| test.rs:68:22:68:50 | TryExpr | test.rs:68:13:68:18 | target | provenance | | +| test.rs:77:13:77:18 | buffer | test.rs:78:14:78:19 | buffer | provenance | | +| test.rs:77:31:77:45 | ...::read | test.rs:77:31:77:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:14 | +| test.rs:77:31:77:57 | ...::read(...) [future, Ok] | test.rs:77:31:77:63 | await ... [Ok] | provenance | | +| test.rs:77:31:77:63 | await ... [Ok] | test.rs:77:31:77:64 | TryExpr | provenance | | +| test.rs:77:31:77:64 | TryExpr | test.rs:77:13:77:18 | buffer | provenance | | +| test.rs:82:13:82:18 | buffer | test.rs:83:14:83:19 | buffer | provenance | | +| test.rs:82:31:82:45 | ...::read | test.rs:82:31:82:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:14 | +| test.rs:82:31:82:57 | ...::read(...) [future, Ok] | test.rs:82:31:82:63 | await ... [Ok] | provenance | | +| test.rs:82:31:82:63 | await ... [Ok] | test.rs:82:31:82:64 | TryExpr | provenance | | +| test.rs:82:31:82:64 | TryExpr | test.rs:82:13:82:18 | buffer | provenance | | +| test.rs:87:13:87:18 | buffer | test.rs:88:14:88:19 | buffer | provenance | | +| test.rs:87:22:87:46 | ...::read_to_string | test.rs:87:22:87:58 | ...::read_to_string(...) [future, Ok] | provenance | Src:MaD:16 | +| test.rs:87:22:87:58 | ...::read_to_string(...) [future, Ok] | test.rs:87:22:87:64 | await ... [Ok] | provenance | | +| test.rs:87:22:87:64 | await ... [Ok] | test.rs:87:22:87:65 | TryExpr | provenance | | +| test.rs:87:22:87:65 | TryExpr | test.rs:87:13:87:18 | buffer | provenance | | +| test.rs:93:13:93:16 | path | test.rs:95:14:95:17 | path | provenance | | +| test.rs:93:20:93:31 | entry.path() | test.rs:93:13:93:16 | path | provenance | | +| test.rs:93:26:93:29 | path | test.rs:93:20:93:31 | entry.path() | provenance | Src:MaD:10 MaD:10 | +| test.rs:94:13:94:21 | file_name | test.rs:96:14:96:22 | file_name | provenance | | +| test.rs:94:25:94:41 | entry.file_name() | test.rs:94:13:94:21 | file_name | provenance | | +| test.rs:94:31:94:39 | file_name | test.rs:94:25:94:41 | entry.file_name() | provenance | Src:MaD:9 MaD:9 | +| test.rs:100:13:100:18 | target | test.rs:101:14:101:19 | target | provenance | | +| test.rs:100:22:100:41 | ...::read_link | test.rs:100:22:100:56 | ...::read_link(...) [future, Ok] | provenance | Src:MaD:15 | +| test.rs:100:22:100:56 | ...::read_link(...) [future, Ok] | test.rs:100:22:100:62 | await ... [Ok] | provenance | | +| test.rs:100:22:100:62 | await ... [Ok] | test.rs:100:22:100:63 | TryExpr | provenance | | +| test.rs:100:22:100:63 | TryExpr | test.rs:100:13:100:18 | target | provenance | | +| test.rs:110:9:110:16 | mut file | test.rs:114:22:114:25 | file | provenance | | +| test.rs:110:9:110:16 | mut file | test.rs:120:22:120:25 | file | provenance | | +| test.rs:110:9:110:16 | mut file | test.rs:126:22:126:25 | file | provenance | | +| test.rs:110:9:110:16 | mut file | test.rs:132:9:132:12 | file | provenance | | +| test.rs:110:9:110:16 | mut file | test.rs:136:17:136:20 | file | provenance | | +| test.rs:110:20:110:38 | ...::open | test.rs:110:20:110:50 | ...::open(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:110:20:110:50 | ...::open(...) [Ok] | test.rs:110:20:110:51 | TryExpr | provenance | | +| test.rs:110:20:110:51 | TryExpr | test.rs:110:9:110:16 | mut file | provenance | | +| test.rs:114:22:114:25 | file | test.rs:114:32:114:42 | [post] &mut buffer [&ref] | provenance | MaD:23 | +| test.rs:114:32:114:42 | [post] &mut buffer [&ref] | test.rs:114:37:114:42 | [post] buffer | provenance | | +| test.rs:114:37:114:42 | [post] buffer | test.rs:115:15:115:20 | buffer | provenance | | +| test.rs:115:15:115:20 | buffer | test.rs:115:14:115:20 | &buffer | provenance | | +| test.rs:120:22:120:25 | file | test.rs:120:39:120:49 | [post] &mut buffer [&ref] | provenance | MaD:25 | +| test.rs:120:39:120:49 | [post] &mut buffer [&ref] | test.rs:120:44:120:49 | [post] buffer | provenance | | +| test.rs:120:44:120:49 | [post] buffer | test.rs:121:15:121:20 | buffer | provenance | | +| test.rs:121:15:121:20 | buffer | test.rs:121:14:121:20 | &buffer | provenance | | +| test.rs:126:22:126:25 | file | test.rs:126:42:126:52 | [post] &mut buffer [&ref] | provenance | MaD:26 | +| test.rs:126:42:126:52 | [post] &mut buffer [&ref] | test.rs:126:47:126:52 | [post] buffer | provenance | | +| test.rs:126:47:126:52 | [post] buffer | test.rs:127:15:127:20 | buffer | provenance | | +| test.rs:127:15:127:20 | buffer | test.rs:127:14:127:20 | &buffer | provenance | | +| test.rs:132:9:132:12 | file | test.rs:132:25:132:35 | [post] &mut buffer [&ref] | provenance | MaD:24 | +| test.rs:132:25:132:35 | [post] &mut buffer [&ref] | test.rs:132:30:132:35 | [post] buffer | provenance | | +| test.rs:132:30:132:35 | [post] buffer | test.rs:133:15:133:20 | buffer | provenance | | +| test.rs:133:15:133:20 | buffer | test.rs:133:14:133:20 | &buffer | provenance | | +| test.rs:136:17:136:20 | file | test.rs:136:17:136:28 | file.bytes() | provenance | MaD:20 | +| test.rs:136:17:136:28 | file.bytes() | test.rs:137:14:137:17 | byte | provenance | | +| test.rs:143:13:143:18 | mut f1 | test.rs:145:22:145:23 | f1 | provenance | | +| test.rs:143:22:143:63 | ... .open(...) [Ok] | test.rs:143:22:143:72 | ... .unwrap() | provenance | MaD:39 | +| test.rs:143:22:143:72 | ... .unwrap() | test.rs:143:13:143:18 | mut f1 | provenance | | +| test.rs:143:50:143:53 | open | test.rs:143:22:143:63 | ... .open(...) [Ok] | provenance | Src:MaD:6 | +| test.rs:145:22:145:23 | f1 | test.rs:145:30:145:40 | [post] &mut buffer [&ref] | provenance | MaD:23 | +| test.rs:145:30:145:40 | [post] &mut buffer [&ref] | test.rs:145:35:145:40 | [post] buffer | provenance | | +| test.rs:145:35:145:40 | [post] buffer | test.rs:146:15:146:20 | buffer | provenance | | +| test.rs:146:15:146:20 | buffer | test.rs:146:14:146:20 | &buffer | provenance | | +| test.rs:150:13:150:18 | mut f2 | test.rs:155:22:155:23 | f2 | provenance | | +| test.rs:150:22:152:27 | ... .open(...) [Ok] | test.rs:150:22:153:21 | ... .unwrap() | provenance | MaD:39 | +| test.rs:150:22:153:21 | ... .unwrap() | test.rs:150:13:150:18 | mut f2 | provenance | | +| test.rs:152:14:152:17 | open | test.rs:150:22:152:27 | ... .open(...) [Ok] | provenance | Src:MaD:6 | +| test.rs:155:22:155:23 | f2 | test.rs:155:30:155:40 | [post] &mut buffer [&ref] | provenance | MaD:23 | +| test.rs:155:30:155:40 | [post] &mut buffer [&ref] | test.rs:155:35:155:40 | [post] buffer | provenance | | +| test.rs:155:35:155:40 | [post] buffer | test.rs:156:15:156:20 | buffer | provenance | | +| test.rs:156:15:156:20 | buffer | test.rs:156:14:156:20 | &buffer | provenance | | +| test.rs:160:13:160:18 | mut f3 | test.rs:168:22:168:23 | f3 | provenance | | +| test.rs:160:22:165:27 | ... .open(...) [Ok] | test.rs:160:22:166:21 | ... .unwrap() | provenance | MaD:39 | +| test.rs:160:22:166:21 | ... .unwrap() | test.rs:160:13:160:18 | mut f3 | provenance | | +| test.rs:165:14:165:17 | open | test.rs:160:22:165:27 | ... .open(...) [Ok] | provenance | Src:MaD:6 | +| test.rs:168:22:168:23 | f3 | test.rs:168:30:168:40 | [post] &mut buffer [&ref] | provenance | MaD:23 | +| test.rs:168:30:168:40 | [post] &mut buffer [&ref] | test.rs:168:35:168:40 | [post] buffer | provenance | | +| test.rs:168:35:168:40 | [post] buffer | test.rs:169:15:169:20 | buffer | provenance | | +| test.rs:169:15:169:20 | buffer | test.rs:169:14:169:20 | &buffer | provenance | | +| test.rs:176:13:176:17 | file1 | test.rs:178:26:178:30 | file1 | provenance | | +| test.rs:176:21:176:39 | ...::open | test.rs:176:21:176:51 | ...::open(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:176:21:176:51 | ...::open(...) [Ok] | test.rs:176:21:176:52 | TryExpr | provenance | | +| test.rs:176:21:176:52 | TryExpr | test.rs:176:13:176:17 | file1 | provenance | | +| test.rs:177:13:177:17 | file2 | test.rs:178:38:178:42 | file2 | provenance | | +| test.rs:177:21:177:39 | ...::open | test.rs:177:21:177:59 | ...::open(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:177:21:177:59 | ...::open(...) [Ok] | test.rs:177:21:177:60 | TryExpr | provenance | | +| test.rs:177:21:177:60 | TryExpr | test.rs:177:13:177:17 | file2 | provenance | | +| test.rs:178:13:178:22 | mut reader | test.rs:179:9:179:14 | reader | provenance | | +| test.rs:178:26:178:30 | file1 | test.rs:178:26:178:43 | file1.chain(...) | provenance | MaD:22 | +| test.rs:178:26:178:43 | file1.chain(...) | test.rs:178:13:178:22 | mut reader | provenance | | +| test.rs:178:38:178:42 | file2 | test.rs:178:26:178:43 | file1.chain(...) | provenance | MaD:21 | +| test.rs:179:9:179:14 | reader | test.rs:179:31:179:41 | [post] &mut buffer [&ref] | provenance | MaD:26 | +| test.rs:179:31:179:41 | [post] &mut buffer [&ref] | test.rs:179:36:179:41 | [post] buffer | provenance | | +| test.rs:179:36:179:41 | [post] buffer | test.rs:180:15:180:20 | buffer | provenance | | +| test.rs:180:15:180:20 | buffer | test.rs:180:14:180:20 | &buffer | provenance | | +| test.rs:185:13:185:17 | file1 | test.rs:186:26:186:30 | file1 | provenance | | +| test.rs:185:21:185:39 | ...::open | test.rs:185:21:185:51 | ...::open(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:185:21:185:51 | ...::open(...) [Ok] | test.rs:185:21:185:52 | TryExpr | provenance | | +| test.rs:185:21:185:52 | TryExpr | test.rs:185:13:185:17 | file1 | provenance | | +| test.rs:186:13:186:22 | mut reader | test.rs:187:9:187:14 | reader | provenance | | +| test.rs:186:26:186:30 | file1 | test.rs:186:26:186:40 | file1.take(...) | provenance | MaD:27 | +| test.rs:186:26:186:40 | file1.take(...) | test.rs:186:13:186:22 | mut reader | provenance | | +| test.rs:187:9:187:14 | reader | test.rs:187:31:187:41 | [post] &mut buffer [&ref] | provenance | MaD:26 | +| test.rs:187:31:187:41 | [post] &mut buffer [&ref] | test.rs:187:36:187:41 | [post] buffer | provenance | | +| test.rs:187:36:187:41 | [post] buffer | test.rs:188:15:188:20 | buffer | provenance | | +| test.rs:188:15:188:20 | buffer | test.rs:188:14:188:20 | &buffer | provenance | | +| test.rs:197:9:197:16 | mut file | test.rs:201:22:201:25 | file | provenance | | +| test.rs:197:9:197:16 | mut file | test.rs:207:22:207:25 | file | provenance | | +| test.rs:197:9:197:16 | mut file | test.rs:213:22:213:25 | file | provenance | | +| test.rs:197:9:197:16 | mut file | test.rs:219:9:219:12 | file | provenance | | +| test.rs:197:9:197:16 | mut file | test.rs:224:18:224:21 | file | provenance | | +| test.rs:197:9:197:16 | mut file | test.rs:225:18:225:21 | file | provenance | | +| test.rs:197:9:197:16 | mut file | test.rs:226:18:226:21 | file | provenance | | +| test.rs:197:9:197:16 | mut file | test.rs:227:18:227:21 | file | provenance | | +| test.rs:197:9:197:16 | mut file | test.rs:236:9:236:12 | file | provenance | | +| test.rs:197:20:197:40 | ...::open | test.rs:197:20:197:52 | ...::open(...) [future, Ok] | provenance | Src:MaD:7 | +| test.rs:197:20:197:52 | ...::open(...) [future, Ok] | test.rs:197:20:197:58 | await ... [Ok] | provenance | | +| test.rs:197:20:197:58 | await ... [Ok] | test.rs:197:20:197:59 | TryExpr | provenance | | +| test.rs:197:20:197:59 | TryExpr | test.rs:197:9:197:16 | mut file | provenance | | +| test.rs:201:22:201:25 | file | test.rs:201:32:201:42 | [post] &mut buffer [&ref] | provenance | MaD:28 | +| test.rs:201:32:201:42 | [post] &mut buffer [&ref] | test.rs:201:37:201:42 | [post] buffer | provenance | | +| test.rs:201:37:201:42 | [post] buffer | test.rs:202:15:202:20 | buffer | provenance | | | test.rs:202:15:202:20 | buffer | test.rs:202:14:202:20 | &buffer | provenance | | -| test.rs:207:9:207:12 | file | test.rs:207:25:207:35 | [post] &mut buffer [&ref] | provenance | MaD:30 | -| test.rs:207:25:207:35 | [post] &mut buffer [&ref] | test.rs:207:30:207:35 | [post] buffer | provenance | | -| test.rs:207:30:207:35 | [post] buffer | test.rs:208:15:208:20 | buffer | provenance | | +| test.rs:207:22:207:25 | file | test.rs:207:39:207:49 | [post] &mut buffer [&ref] | provenance | MaD:34 | +| test.rs:207:39:207:49 | [post] &mut buffer [&ref] | test.rs:207:44:207:49 | [post] buffer | provenance | | +| test.rs:207:44:207:49 | [post] buffer | test.rs:208:15:208:20 | buffer | provenance | | | test.rs:208:15:208:20 | buffer | test.rs:208:14:208:20 | &buffer | provenance | | -| test.rs:212:13:212:14 | v1 | test.rs:216:14:216:15 | v1 | provenance | | -| test.rs:212:18:212:21 | file | test.rs:212:18:212:31 | file.read_u8() [future, Ok] | provenance | MaD:36 | -| test.rs:212:18:212:31 | file.read_u8() [future, Ok] | test.rs:212:18:212:37 | await ... [Ok] | provenance | | -| test.rs:212:18:212:37 | await ... [Ok] | test.rs:212:18:212:38 | TryExpr | provenance | | -| test.rs:212:18:212:38 | TryExpr | test.rs:212:13:212:14 | v1 | provenance | | -| test.rs:213:13:213:14 | v2 | test.rs:217:14:217:15 | v2 | provenance | | -| test.rs:213:18:213:21 | file | test.rs:213:18:213:32 | file.read_i16() [future, Ok] | provenance | MaD:32 | -| test.rs:213:18:213:32 | file.read_i16() [future, Ok] | test.rs:213:18:213:38 | await ... [Ok] | provenance | | -| test.rs:213:18:213:38 | await ... [Ok] | test.rs:213:18:213:39 | TryExpr | provenance | | -| test.rs:213:18:213:39 | TryExpr | test.rs:213:13:213:14 | v2 | provenance | | -| test.rs:214:13:214:14 | v3 | test.rs:218:14:218:15 | v3 | provenance | | -| test.rs:214:18:214:21 | file | test.rs:214:18:214:32 | file.read_f32() [future, Ok] | provenance | MaD:31 | -| test.rs:214:18:214:32 | file.read_f32() [future, Ok] | test.rs:214:18:214:38 | await ... [Ok] | provenance | | -| test.rs:214:18:214:38 | await ... [Ok] | test.rs:214:18:214:39 | TryExpr | provenance | | -| test.rs:214:18:214:39 | TryExpr | test.rs:214:13:214:14 | v3 | provenance | | -| test.rs:215:13:215:14 | v4 | test.rs:219:14:219:15 | v4 | provenance | | -| test.rs:215:18:215:21 | file | test.rs:215:18:215:35 | file.read_i64_le() [future, Ok] | provenance | MaD:33 | -| test.rs:215:18:215:35 | file.read_i64_le() [future, Ok] | test.rs:215:18:215:41 | await ... [Ok] | provenance | | -| test.rs:215:18:215:41 | await ... [Ok] | test.rs:215:18:215:42 | TryExpr | provenance | | -| test.rs:215:18:215:42 | TryExpr | test.rs:215:13:215:14 | v4 | provenance | | -| test.rs:224:9:224:12 | file | test.rs:224:23:224:33 | [post] &mut buffer [&ref] | provenance | MaD:29 | -| test.rs:224:23:224:33 | [post] &mut buffer [&ref] | test.rs:224:28:224:33 | [post] buffer | provenance | | -| test.rs:224:28:224:33 | [post] buffer | test.rs:225:15:225:20 | buffer | provenance | | -| test.rs:225:15:225:20 | buffer | test.rs:225:14:225:20 | &buffer | provenance | | -| test.rs:231:13:231:18 | mut f1 | test.rs:233:22:233:23 | f1 | provenance | | -| test.rs:231:22:231:65 | ... .open(...) [future, Ok] | test.rs:231:22:231:71 | await ... [Ok] | provenance | | -| test.rs:231:22:231:71 | await ... [Ok] | test.rs:231:22:231:72 | TryExpr | provenance | | -| test.rs:231:22:231:72 | TryExpr | test.rs:231:13:231:18 | mut f1 | provenance | | -| test.rs:231:52:231:55 | open | test.rs:231:22:231:65 | ... .open(...) [future, Ok] | provenance | Src:MaD:8 | -| test.rs:233:22:233:23 | f1 | test.rs:233:30:233:40 | [post] &mut buffer [&ref] | provenance | MaD:28 | -| test.rs:233:30:233:40 | [post] &mut buffer [&ref] | test.rs:233:35:233:40 | [post] buffer | provenance | | -| test.rs:233:35:233:40 | [post] buffer | test.rs:234:15:234:20 | buffer | provenance | | -| test.rs:234:15:234:20 | buffer | test.rs:234:14:234:20 | &buffer | provenance | | -| test.rs:262:9:262:16 | mut file | test.rs:266:22:266:25 | file | provenance | | -| test.rs:262:20:262:44 | ...::open | test.rs:262:20:262:56 | ...::open(...) [future, Ok] | provenance | Src:MaD:1 | -| test.rs:262:20:262:56 | ...::open(...) [future, Ok] | test.rs:262:20:262:62 | await ... [Ok] | provenance | | -| test.rs:262:20:262:62 | await ... [Ok] | test.rs:262:20:262:63 | TryExpr | provenance | | -| test.rs:262:20:262:63 | TryExpr | test.rs:262:9:262:16 | mut file | provenance | | -| test.rs:266:22:266:25 | file | test.rs:266:32:266:42 | [post] &mut buffer [&ref] | provenance | MaD:17 | -| test.rs:266:32:266:42 | [post] &mut buffer [&ref] | test.rs:266:37:266:42 | [post] buffer | provenance | | -| test.rs:266:37:266:42 | [post] buffer | test.rs:267:15:267:20 | buffer | provenance | | -| test.rs:267:15:267:20 | buffer | test.rs:267:14:267:20 | &buffer | provenance | | -| test.rs:273:13:273:18 | mut f1 | test.rs:275:22:275:23 | f1 | provenance | | -| test.rs:273:22:273:69 | ... .open(...) [future, Ok] | test.rs:273:22:273:75 | await ... [Ok] | provenance | | -| test.rs:273:22:273:75 | await ... [Ok] | test.rs:273:22:273:76 | TryExpr | provenance | | -| test.rs:273:22:273:76 | TryExpr | test.rs:273:13:273:18 | mut f1 | provenance | | -| test.rs:273:56:273:59 | open | test.rs:273:22:273:69 | ... .open(...) [future, Ok] | provenance | Src:MaD:2 | -| test.rs:275:22:275:23 | f1 | test.rs:275:30:275:40 | [post] &mut buffer [&ref] | provenance | MaD:17 | -| test.rs:275:30:275:40 | [post] &mut buffer [&ref] | test.rs:275:35:275:40 | [post] buffer | provenance | | -| test.rs:275:35:275:40 | [post] buffer | test.rs:276:15:276:20 | buffer | provenance | | -| test.rs:276:15:276:20 | buffer | test.rs:276:14:276:20 | &buffer | provenance | | +| test.rs:213:22:213:25 | file | test.rs:213:42:213:52 | [post] &mut buffer [&ref] | provenance | MaD:35 | +| test.rs:213:42:213:52 | [post] &mut buffer [&ref] | test.rs:213:47:213:52 | [post] buffer | provenance | | +| test.rs:213:47:213:52 | [post] buffer | test.rs:214:15:214:20 | buffer | provenance | | +| test.rs:214:15:214:20 | buffer | test.rs:214:14:214:20 | &buffer | provenance | | +| test.rs:219:9:219:12 | file | test.rs:219:25:219:35 | [post] &mut buffer [&ref] | provenance | MaD:30 | +| test.rs:219:25:219:35 | [post] &mut buffer [&ref] | test.rs:219:30:219:35 | [post] buffer | provenance | | +| test.rs:219:30:219:35 | [post] buffer | test.rs:220:15:220:20 | buffer | provenance | | +| test.rs:220:15:220:20 | buffer | test.rs:220:14:220:20 | &buffer | provenance | | +| test.rs:224:13:224:14 | v1 | test.rs:228:14:228:15 | v1 | provenance | | +| test.rs:224:18:224:21 | file | test.rs:224:18:224:31 | file.read_u8() [future, Ok] | provenance | MaD:36 | +| test.rs:224:18:224:31 | file.read_u8() [future, Ok] | test.rs:224:18:224:37 | await ... [Ok] | provenance | | +| test.rs:224:18:224:37 | await ... [Ok] | test.rs:224:18:224:38 | TryExpr | provenance | | +| test.rs:224:18:224:38 | TryExpr | test.rs:224:13:224:14 | v1 | provenance | | +| test.rs:225:13:225:14 | v2 | test.rs:229:14:229:15 | v2 | provenance | | +| test.rs:225:18:225:21 | file | test.rs:225:18:225:32 | file.read_i16() [future, Ok] | provenance | MaD:32 | +| test.rs:225:18:225:32 | file.read_i16() [future, Ok] | test.rs:225:18:225:38 | await ... [Ok] | provenance | | +| test.rs:225:18:225:38 | await ... [Ok] | test.rs:225:18:225:39 | TryExpr | provenance | | +| test.rs:225:18:225:39 | TryExpr | test.rs:225:13:225:14 | v2 | provenance | | +| test.rs:226:13:226:14 | v3 | test.rs:230:14:230:15 | v3 | provenance | | +| test.rs:226:18:226:21 | file | test.rs:226:18:226:32 | file.read_f32() [future, Ok] | provenance | MaD:31 | +| test.rs:226:18:226:32 | file.read_f32() [future, Ok] | test.rs:226:18:226:38 | await ... [Ok] | provenance | | +| test.rs:226:18:226:38 | await ... [Ok] | test.rs:226:18:226:39 | TryExpr | provenance | | +| test.rs:226:18:226:39 | TryExpr | test.rs:226:13:226:14 | v3 | provenance | | +| test.rs:227:13:227:14 | v4 | test.rs:231:14:231:15 | v4 | provenance | | +| test.rs:227:18:227:21 | file | test.rs:227:18:227:35 | file.read_i64_le() [future, Ok] | provenance | MaD:33 | +| test.rs:227:18:227:35 | file.read_i64_le() [future, Ok] | test.rs:227:18:227:41 | await ... [Ok] | provenance | | +| test.rs:227:18:227:41 | await ... [Ok] | test.rs:227:18:227:42 | TryExpr | provenance | | +| test.rs:227:18:227:42 | TryExpr | test.rs:227:13:227:14 | v4 | provenance | | +| test.rs:236:9:236:12 | file | test.rs:236:23:236:33 | [post] &mut buffer [&ref] | provenance | MaD:29 | +| test.rs:236:23:236:33 | [post] &mut buffer [&ref] | test.rs:236:28:236:33 | [post] buffer | provenance | | +| test.rs:236:28:236:33 | [post] buffer | test.rs:237:15:237:20 | buffer | provenance | | +| test.rs:237:15:237:20 | buffer | test.rs:237:14:237:20 | &buffer | provenance | | +| test.rs:243:13:243:18 | mut f1 | test.rs:245:22:245:23 | f1 | provenance | | +| test.rs:243:22:243:65 | ... .open(...) [future, Ok] | test.rs:243:22:243:71 | await ... [Ok] | provenance | | +| test.rs:243:22:243:71 | await ... [Ok] | test.rs:243:22:243:72 | TryExpr | provenance | | +| test.rs:243:22:243:72 | TryExpr | test.rs:243:13:243:18 | mut f1 | provenance | | +| test.rs:243:52:243:55 | open | test.rs:243:22:243:65 | ... .open(...) [future, Ok] | provenance | Src:MaD:8 | +| test.rs:245:22:245:23 | f1 | test.rs:245:30:245:40 | [post] &mut buffer [&ref] | provenance | MaD:28 | +| test.rs:245:30:245:40 | [post] &mut buffer [&ref] | test.rs:245:35:245:40 | [post] buffer | provenance | | +| test.rs:245:35:245:40 | [post] buffer | test.rs:246:15:246:20 | buffer | provenance | | +| test.rs:246:15:246:20 | buffer | test.rs:246:14:246:20 | &buffer | provenance | | +| test.rs:274:9:274:16 | mut file | test.rs:278:22:278:25 | file | provenance | | +| test.rs:274:20:274:44 | ...::open | test.rs:274:20:274:56 | ...::open(...) [future, Ok] | provenance | Src:MaD:1 | +| test.rs:274:20:274:56 | ...::open(...) [future, Ok] | test.rs:274:20:274:62 | await ... [Ok] | provenance | | +| test.rs:274:20:274:62 | await ... [Ok] | test.rs:274:20:274:63 | TryExpr | provenance | | +| test.rs:274:20:274:63 | TryExpr | test.rs:274:9:274:16 | mut file | provenance | | +| test.rs:278:22:278:25 | file | test.rs:278:32:278:42 | [post] &mut buffer [&ref] | provenance | MaD:17 | +| test.rs:278:32:278:42 | [post] &mut buffer [&ref] | test.rs:278:37:278:42 | [post] buffer | provenance | | +| test.rs:278:37:278:42 | [post] buffer | test.rs:279:15:279:20 | buffer | provenance | | +| test.rs:279:15:279:20 | buffer | test.rs:279:14:279:20 | &buffer | provenance | | +| test.rs:285:13:285:18 | mut f1 | test.rs:287:22:287:23 | f1 | provenance | | +| test.rs:285:22:285:69 | ... .open(...) [future, Ok] | test.rs:285:22:285:75 | await ... [Ok] | provenance | | +| test.rs:285:22:285:75 | await ... [Ok] | test.rs:285:22:285:76 | TryExpr | provenance | | +| test.rs:285:22:285:76 | TryExpr | test.rs:285:13:285:18 | mut f1 | provenance | | +| test.rs:285:56:285:59 | open | test.rs:285:22:285:69 | ... .open(...) [future, Ok] | provenance | Src:MaD:2 | +| test.rs:287:22:287:23 | f1 | test.rs:287:30:287:40 | [post] &mut buffer [&ref] | provenance | MaD:17 | +| test.rs:287:30:287:40 | [post] &mut buffer [&ref] | test.rs:287:35:287:40 | [post] buffer | provenance | | +| test.rs:287:35:287:40 | [post] buffer | test.rs:288:15:288:20 | buffer | provenance | | +| test.rs:288:15:288:20 | buffer | test.rs:288:14:288:20 | &buffer | provenance | | nodes | test.rs:12:13:12:18 | buffer | semmle.label | buffer | | test.rs:12:31:12:43 | ...::read | semmle.label | ...::read | @@ -274,272 +311,315 @@ nodes | test.rs:22:22:22:51 | ...::read_to_string(...) [Ok] | semmle.label | ...::read_to_string(...) [Ok] | | test.rs:22:22:22:52 | TryExpr | semmle.label | TryExpr | | test.rs:23:14:23:19 | buffer | semmle.label | buffer | -| test.rs:29:13:29:16 | path | semmle.label | path | -| test.rs:29:20:29:27 | e.path() | semmle.label | e.path() | -| test.rs:29:22:29:25 | path | semmle.label | path | -| test.rs:30:14:30:17 | path | semmle.label | path | -| test.rs:30:14:30:25 | path.clone() | semmle.label | path.clone() | +| test.rs:30:13:30:16 | path | semmle.label | path | +| test.rs:30:20:30:27 | e.path() | semmle.label | e.path() | +| test.rs:30:22:30:25 | path | semmle.label | path | | test.rs:31:14:31:17 | path | semmle.label | path | | test.rs:31:14:31:25 | path.clone() | semmle.label | path.clone() | -| test.rs:31:14:31:35 | ... .as_path() | semmle.label | ... .as_path() | +| test.rs:32:14:32:17 | path | semmle.label | path | +| test.rs:32:14:32:25 | path.clone() | semmle.label | path.clone() | +| test.rs:32:14:32:35 | ... .as_path() | semmle.label | ... .as_path() | +| test.rs:33:14:33:17 | path | semmle.label | path | +| test.rs:33:14:33:25 | path.clone() | semmle.label | path.clone() | +| test.rs:33:14:33:42 | ... .into_os_string() | semmle.label | ... .into_os_string() | +| test.rs:34:14:34:69 | ...::from(...) | semmle.label | ...::from(...) | +| test.rs:34:39:34:42 | path | semmle.label | path | +| test.rs:34:39:34:50 | path.clone() | semmle.label | path.clone() | +| test.rs:34:39:34:68 | ... .into_boxed_path() [Box(0)] | semmle.label | ... .into_boxed_path() [Box(0)] | +| test.rs:35:14:35:17 | path | semmle.label | path | +| test.rs:35:14:35:25 | path.clone() | semmle.label | path.clone() | +| test.rs:35:14:35:37 | ... .as_os_str() | semmle.label | ... .as_os_str() | +| test.rs:36:14:36:17 | path | semmle.label | path | +| test.rs:36:14:36:25 | path.clone() | semmle.label | path.clone() | +| test.rs:36:14:36:41 | ... .as_mut_os_str() | semmle.label | ... .as_mut_os_str() | +| test.rs:37:14:37:17 | path | semmle.label | path | +| test.rs:37:14:37:26 | path.to_str() | semmle.label | path.to_str() | +| test.rs:38:14:38:17 | path | semmle.label | path | +| test.rs:38:14:38:31 | path.to_path_buf() | semmle.label | path.to_path_buf() | +| test.rs:39:14:39:17 | path | semmle.label | path | +| test.rs:39:14:39:29 | path.file_name() [Some, &ref] | semmle.label | path.file_name() [Some, &ref] | +| test.rs:39:14:39:38 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:40:14:40:17 | path | semmle.label | path | -| test.rs:40:14:40:32 | path.canonicalize() [Ok] | semmle.label | path.canonicalize() [Ok] | -| test.rs:40:14:40:41 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:40:14:40:29 | path.extension() [Some, &ref] | semmle.label | path.extension() [Some, &ref] | +| test.rs:40:14:40:38 | ... .unwrap() | semmle.label | ... .unwrap() | | test.rs:41:14:41:17 | path | semmle.label | path | -| test.rs:43:13:43:21 | file_name | semmle.label | file_name | -| test.rs:43:25:43:37 | e.file_name() | semmle.label | e.file_name() | -| test.rs:43:27:43:35 | file_name | semmle.label | file_name | -| test.rs:44:14:44:22 | file_name | semmle.label | file_name | -| test.rs:44:14:44:30 | file_name.clone() | semmle.label | file_name.clone() | +| test.rs:41:14:41:32 | path.canonicalize() [Ok] | semmle.label | path.canonicalize() [Ok] | +| test.rs:41:14:41:41 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:42:14:42:17 | path | semmle.label | path | +| test.rs:44:13:44:21 | file_name | semmle.label | file_name | +| test.rs:44:25:44:37 | e.file_name() | semmle.label | e.file_name() | +| test.rs:44:27:44:35 | file_name | semmle.label | file_name | | test.rs:45:14:45:22 | file_name | semmle.label | file_name | | test.rs:45:14:45:30 | file_name.clone() | semmle.label | file_name.clone() | -| test.rs:45:14:45:44 | ... .into_string() [Ok, String] | semmle.label | ... .into_string() [Ok, String] | -| test.rs:45:14:45:53 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:46:14:46:22 | file_name | semmle.label | file_name | +| test.rs:46:14:46:30 | file_name.clone() | semmle.label | file_name.clone() | +| test.rs:46:14:46:44 | ... .into_string() [Ok, String] | semmle.label | ... .into_string() [Ok, String] | +| test.rs:46:14:46:53 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:47:14:47:22 | file_name | semmle.label | file_name | +| test.rs:47:14:47:31 | file_name.to_str() [Some, &ref] | semmle.label | file_name.to_str() [Some, &ref] | +| test.rs:47:14:47:40 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:48:14:48:22 | file_name | semmle.label | file_name | +| test.rs:48:14:48:40 | file_name.to_string_lossy() [Owned] | semmle.label | file_name.to_string_lossy() [Owned] | +| test.rs:48:14:48:49 | ... .to_mut() | semmle.label | ... .to_mut() | | test.rs:49:14:49:22 | file_name | semmle.label | file_name | -| test.rs:65:13:65:18 | target | semmle.label | target | -| test.rs:65:22:65:34 | ...::read_link | semmle.label | ...::read_link | -| test.rs:65:22:65:49 | ...::read_link(...) [Ok] | semmle.label | ...::read_link(...) [Ok] | -| test.rs:65:22:65:50 | TryExpr | semmle.label | TryExpr | -| test.rs:66:14:66:19 | target | semmle.label | target | -| test.rs:74:13:74:18 | buffer | semmle.label | buffer | -| test.rs:74:31:74:45 | ...::read | semmle.label | ...::read | -| test.rs:74:31:74:57 | ...::read(...) [future, Ok] | semmle.label | ...::read(...) [future, Ok] | -| test.rs:74:31:74:63 | await ... [Ok] | semmle.label | await ... [Ok] | -| test.rs:74:31:74:64 | TryExpr | semmle.label | TryExpr | -| test.rs:75:14:75:19 | buffer | semmle.label | buffer | -| test.rs:79:13:79:18 | buffer | semmle.label | buffer | -| test.rs:79:31:79:45 | ...::read | semmle.label | ...::read | -| test.rs:79:31:79:57 | ...::read(...) [future, Ok] | semmle.label | ...::read(...) [future, Ok] | -| test.rs:79:31:79:63 | await ... [Ok] | semmle.label | await ... [Ok] | -| test.rs:79:31:79:64 | TryExpr | semmle.label | TryExpr | -| test.rs:80:14:80:19 | buffer | semmle.label | buffer | -| test.rs:84:13:84:18 | buffer | semmle.label | buffer | -| test.rs:84:22:84:46 | ...::read_to_string | semmle.label | ...::read_to_string | -| test.rs:84:22:84:58 | ...::read_to_string(...) [future, Ok] | semmle.label | ...::read_to_string(...) [future, Ok] | -| test.rs:84:22:84:64 | await ... [Ok] | semmle.label | await ... [Ok] | -| test.rs:84:22:84:65 | TryExpr | semmle.label | TryExpr | -| test.rs:85:14:85:19 | buffer | semmle.label | buffer | -| test.rs:90:13:90:16 | path | semmle.label | path | -| test.rs:90:20:90:31 | entry.path() | semmle.label | entry.path() | -| test.rs:90:26:90:29 | path | semmle.label | path | -| test.rs:91:13:91:21 | file_name | semmle.label | file_name | -| test.rs:91:25:91:41 | entry.file_name() | semmle.label | entry.file_name() | -| test.rs:91:31:91:39 | file_name | semmle.label | file_name | -| test.rs:92:14:92:17 | path | semmle.label | path | -| test.rs:93:14:93:22 | file_name | semmle.label | file_name | -| test.rs:97:13:97:18 | target | semmle.label | target | -| test.rs:97:22:97:41 | ...::read_link | semmle.label | ...::read_link | -| test.rs:97:22:97:56 | ...::read_link(...) [future, Ok] | semmle.label | ...::read_link(...) [future, Ok] | -| test.rs:97:22:97:62 | await ... [Ok] | semmle.label | await ... [Ok] | -| test.rs:97:22:97:63 | TryExpr | semmle.label | TryExpr | -| test.rs:98:14:98:19 | target | semmle.label | target | -| test.rs:107:9:107:16 | mut file | semmle.label | mut file | -| test.rs:107:20:107:38 | ...::open | semmle.label | ...::open | -| test.rs:107:20:107:50 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | -| test.rs:107:20:107:51 | TryExpr | semmle.label | TryExpr | -| test.rs:111:22:111:25 | file | semmle.label | file | -| test.rs:111:32:111:42 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:111:37:111:42 | [post] buffer | semmle.label | [post] buffer | -| test.rs:112:14:112:20 | &buffer | semmle.label | &buffer | -| test.rs:112:15:112:20 | buffer | semmle.label | buffer | -| test.rs:117:22:117:25 | file | semmle.label | file | -| test.rs:117:39:117:49 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:117:44:117:49 | [post] buffer | semmle.label | [post] buffer | -| test.rs:118:14:118:20 | &buffer | semmle.label | &buffer | -| test.rs:118:15:118:20 | buffer | semmle.label | buffer | -| test.rs:123:22:123:25 | file | semmle.label | file | -| test.rs:123:42:123:52 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:123:47:123:52 | [post] buffer | semmle.label | [post] buffer | -| test.rs:124:14:124:20 | &buffer | semmle.label | &buffer | -| test.rs:124:15:124:20 | buffer | semmle.label | buffer | -| test.rs:129:9:129:12 | file | semmle.label | file | -| test.rs:129:25:129:35 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:129:30:129:35 | [post] buffer | semmle.label | [post] buffer | -| test.rs:130:14:130:20 | &buffer | semmle.label | &buffer | -| test.rs:130:15:130:20 | buffer | semmle.label | buffer | -| test.rs:133:17:133:20 | file | semmle.label | file | -| test.rs:133:17:133:28 | file.bytes() | semmle.label | file.bytes() | -| test.rs:134:14:134:17 | byte | semmle.label | byte | -| test.rs:140:13:140:18 | mut f1 | semmle.label | mut f1 | -| test.rs:140:22:140:63 | ... .open(...) [Ok] | semmle.label | ... .open(...) [Ok] | -| test.rs:140:22:140:72 | ... .unwrap() | semmle.label | ... .unwrap() | -| test.rs:140:50:140:53 | open | semmle.label | open | -| test.rs:142:22:142:23 | f1 | semmle.label | f1 | -| test.rs:142:30:142:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:142:35:142:40 | [post] buffer | semmle.label | [post] buffer | -| test.rs:143:14:143:20 | &buffer | semmle.label | &buffer | -| test.rs:143:15:143:20 | buffer | semmle.label | buffer | -| test.rs:147:13:147:18 | mut f2 | semmle.label | mut f2 | -| test.rs:147:22:147:80 | ... .open(...) [Ok] | semmle.label | ... .open(...) [Ok] | -| test.rs:147:22:147:89 | ... .unwrap() | semmle.label | ... .unwrap() | -| test.rs:147:67:147:70 | open | semmle.label | open | -| test.rs:149:22:149:23 | f2 | semmle.label | f2 | -| test.rs:149:30:149:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:149:35:149:40 | [post] buffer | semmle.label | [post] buffer | -| test.rs:150:14:150:20 | &buffer | semmle.label | &buffer | -| test.rs:150:15:150:20 | buffer | semmle.label | buffer | -| test.rs:154:13:154:18 | mut f3 | semmle.label | mut f3 | -| test.rs:154:22:154:114 | ... .open(...) [Ok] | semmle.label | ... .open(...) [Ok] | -| test.rs:154:22:154:123 | ... .unwrap() | semmle.label | ... .unwrap() | -| test.rs:154:101:154:104 | open | semmle.label | open | -| test.rs:156:22:156:23 | f3 | semmle.label | f3 | -| test.rs:156:30:156:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:156:35:156:40 | [post] buffer | semmle.label | [post] buffer | -| test.rs:157:14:157:20 | &buffer | semmle.label | &buffer | -| test.rs:157:15:157:20 | buffer | semmle.label | buffer | -| test.rs:164:13:164:17 | file1 | semmle.label | file1 | -| test.rs:164:21:164:39 | ...::open | semmle.label | ...::open | -| test.rs:164:21:164:51 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | -| test.rs:164:21:164:52 | TryExpr | semmle.label | TryExpr | -| test.rs:165:13:165:17 | file2 | semmle.label | file2 | -| test.rs:165:21:165:39 | ...::open | semmle.label | ...::open | -| test.rs:165:21:165:59 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | -| test.rs:165:21:165:60 | TryExpr | semmle.label | TryExpr | -| test.rs:166:13:166:22 | mut reader | semmle.label | mut reader | -| test.rs:166:26:166:30 | file1 | semmle.label | file1 | -| test.rs:166:26:166:43 | file1.chain(...) | semmle.label | file1.chain(...) | -| test.rs:166:38:166:42 | file2 | semmle.label | file2 | -| test.rs:167:9:167:14 | reader | semmle.label | reader | -| test.rs:167:31:167:41 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:167:36:167:41 | [post] buffer | semmle.label | [post] buffer | -| test.rs:168:14:168:20 | &buffer | semmle.label | &buffer | -| test.rs:168:15:168:20 | buffer | semmle.label | buffer | -| test.rs:173:13:173:17 | file1 | semmle.label | file1 | -| test.rs:173:21:173:39 | ...::open | semmle.label | ...::open | -| test.rs:173:21:173:51 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | -| test.rs:173:21:173:52 | TryExpr | semmle.label | TryExpr | -| test.rs:174:13:174:22 | mut reader | semmle.label | mut reader | -| test.rs:174:26:174:30 | file1 | semmle.label | file1 | -| test.rs:174:26:174:40 | file1.take(...) | semmle.label | file1.take(...) | -| test.rs:175:9:175:14 | reader | semmle.label | reader | -| test.rs:175:31:175:41 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:175:36:175:41 | [post] buffer | semmle.label | [post] buffer | -| test.rs:176:14:176:20 | &buffer | semmle.label | &buffer | -| test.rs:176:15:176:20 | buffer | semmle.label | buffer | -| test.rs:185:9:185:16 | mut file | semmle.label | mut file | -| test.rs:185:20:185:40 | ...::open | semmle.label | ...::open | -| test.rs:185:20:185:52 | ...::open(...) [future, Ok] | semmle.label | ...::open(...) [future, Ok] | -| test.rs:185:20:185:58 | await ... [Ok] | semmle.label | await ... [Ok] | -| test.rs:185:20:185:59 | TryExpr | semmle.label | TryExpr | -| test.rs:189:22:189:25 | file | semmle.label | file | -| test.rs:189:32:189:42 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:189:37:189:42 | [post] buffer | semmle.label | [post] buffer | -| test.rs:190:14:190:20 | &buffer | semmle.label | &buffer | -| test.rs:190:15:190:20 | buffer | semmle.label | buffer | -| test.rs:195:22:195:25 | file | semmle.label | file | -| test.rs:195:39:195:49 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:195:44:195:49 | [post] buffer | semmle.label | [post] buffer | -| test.rs:196:14:196:20 | &buffer | semmle.label | &buffer | -| test.rs:196:15:196:20 | buffer | semmle.label | buffer | +| test.rs:49:14:49:30 | file_name.clone() | semmle.label | file_name.clone() | +| test.rs:49:14:49:49 | ... .as_encoded_bytes() | semmle.label | ... .as_encoded_bytes() | +| test.rs:50:14:50:22 | file_name | semmle.label | file_name | +| test.rs:68:13:68:18 | target | semmle.label | target | +| test.rs:68:22:68:34 | ...::read_link | semmle.label | ...::read_link | +| test.rs:68:22:68:49 | ...::read_link(...) [Ok] | semmle.label | ...::read_link(...) [Ok] | +| test.rs:68:22:68:50 | TryExpr | semmle.label | TryExpr | +| test.rs:69:14:69:19 | target | semmle.label | target | +| test.rs:77:13:77:18 | buffer | semmle.label | buffer | +| test.rs:77:31:77:45 | ...::read | semmle.label | ...::read | +| test.rs:77:31:77:57 | ...::read(...) [future, Ok] | semmle.label | ...::read(...) [future, Ok] | +| test.rs:77:31:77:63 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:77:31:77:64 | TryExpr | semmle.label | TryExpr | +| test.rs:78:14:78:19 | buffer | semmle.label | buffer | +| test.rs:82:13:82:18 | buffer | semmle.label | buffer | +| test.rs:82:31:82:45 | ...::read | semmle.label | ...::read | +| test.rs:82:31:82:57 | ...::read(...) [future, Ok] | semmle.label | ...::read(...) [future, Ok] | +| test.rs:82:31:82:63 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:82:31:82:64 | TryExpr | semmle.label | TryExpr | +| test.rs:83:14:83:19 | buffer | semmle.label | buffer | +| test.rs:87:13:87:18 | buffer | semmle.label | buffer | +| test.rs:87:22:87:46 | ...::read_to_string | semmle.label | ...::read_to_string | +| test.rs:87:22:87:58 | ...::read_to_string(...) [future, Ok] | semmle.label | ...::read_to_string(...) [future, Ok] | +| test.rs:87:22:87:64 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:87:22:87:65 | TryExpr | semmle.label | TryExpr | +| test.rs:88:14:88:19 | buffer | semmle.label | buffer | +| test.rs:93:13:93:16 | path | semmle.label | path | +| test.rs:93:20:93:31 | entry.path() | semmle.label | entry.path() | +| test.rs:93:26:93:29 | path | semmle.label | path | +| test.rs:94:13:94:21 | file_name | semmle.label | file_name | +| test.rs:94:25:94:41 | entry.file_name() | semmle.label | entry.file_name() | +| test.rs:94:31:94:39 | file_name | semmle.label | file_name | +| test.rs:95:14:95:17 | path | semmle.label | path | +| test.rs:96:14:96:22 | file_name | semmle.label | file_name | +| test.rs:100:13:100:18 | target | semmle.label | target | +| test.rs:100:22:100:41 | ...::read_link | semmle.label | ...::read_link | +| test.rs:100:22:100:56 | ...::read_link(...) [future, Ok] | semmle.label | ...::read_link(...) [future, Ok] | +| test.rs:100:22:100:62 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:100:22:100:63 | TryExpr | semmle.label | TryExpr | +| test.rs:101:14:101:19 | target | semmle.label | target | +| test.rs:110:9:110:16 | mut file | semmle.label | mut file | +| test.rs:110:20:110:38 | ...::open | semmle.label | ...::open | +| test.rs:110:20:110:50 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | +| test.rs:110:20:110:51 | TryExpr | semmle.label | TryExpr | +| test.rs:114:22:114:25 | file | semmle.label | file | +| test.rs:114:32:114:42 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:114:37:114:42 | [post] buffer | semmle.label | [post] buffer | +| test.rs:115:14:115:20 | &buffer | semmle.label | &buffer | +| test.rs:115:15:115:20 | buffer | semmle.label | buffer | +| test.rs:120:22:120:25 | file | semmle.label | file | +| test.rs:120:39:120:49 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:120:44:120:49 | [post] buffer | semmle.label | [post] buffer | +| test.rs:121:14:121:20 | &buffer | semmle.label | &buffer | +| test.rs:121:15:121:20 | buffer | semmle.label | buffer | +| test.rs:126:22:126:25 | file | semmle.label | file | +| test.rs:126:42:126:52 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:126:47:126:52 | [post] buffer | semmle.label | [post] buffer | +| test.rs:127:14:127:20 | &buffer | semmle.label | &buffer | +| test.rs:127:15:127:20 | buffer | semmle.label | buffer | +| test.rs:132:9:132:12 | file | semmle.label | file | +| test.rs:132:25:132:35 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:132:30:132:35 | [post] buffer | semmle.label | [post] buffer | +| test.rs:133:14:133:20 | &buffer | semmle.label | &buffer | +| test.rs:133:15:133:20 | buffer | semmle.label | buffer | +| test.rs:136:17:136:20 | file | semmle.label | file | +| test.rs:136:17:136:28 | file.bytes() | semmle.label | file.bytes() | +| test.rs:137:14:137:17 | byte | semmle.label | byte | +| test.rs:143:13:143:18 | mut f1 | semmle.label | mut f1 | +| test.rs:143:22:143:63 | ... .open(...) [Ok] | semmle.label | ... .open(...) [Ok] | +| test.rs:143:22:143:72 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:143:50:143:53 | open | semmle.label | open | +| test.rs:145:22:145:23 | f1 | semmle.label | f1 | +| test.rs:145:30:145:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:145:35:145:40 | [post] buffer | semmle.label | [post] buffer | +| test.rs:146:14:146:20 | &buffer | semmle.label | &buffer | +| test.rs:146:15:146:20 | buffer | semmle.label | buffer | +| test.rs:150:13:150:18 | mut f2 | semmle.label | mut f2 | +| test.rs:150:22:152:27 | ... .open(...) [Ok] | semmle.label | ... .open(...) [Ok] | +| test.rs:150:22:153:21 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:152:14:152:17 | open | semmle.label | open | +| test.rs:155:22:155:23 | f2 | semmle.label | f2 | +| test.rs:155:30:155:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:155:35:155:40 | [post] buffer | semmle.label | [post] buffer | +| test.rs:156:14:156:20 | &buffer | semmle.label | &buffer | +| test.rs:156:15:156:20 | buffer | semmle.label | buffer | +| test.rs:160:13:160:18 | mut f3 | semmle.label | mut f3 | +| test.rs:160:22:165:27 | ... .open(...) [Ok] | semmle.label | ... .open(...) [Ok] | +| test.rs:160:22:166:21 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:165:14:165:17 | open | semmle.label | open | +| test.rs:168:22:168:23 | f3 | semmle.label | f3 | +| test.rs:168:30:168:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:168:35:168:40 | [post] buffer | semmle.label | [post] buffer | +| test.rs:169:14:169:20 | &buffer | semmle.label | &buffer | +| test.rs:169:15:169:20 | buffer | semmle.label | buffer | +| test.rs:176:13:176:17 | file1 | semmle.label | file1 | +| test.rs:176:21:176:39 | ...::open | semmle.label | ...::open | +| test.rs:176:21:176:51 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | +| test.rs:176:21:176:52 | TryExpr | semmle.label | TryExpr | +| test.rs:177:13:177:17 | file2 | semmle.label | file2 | +| test.rs:177:21:177:39 | ...::open | semmle.label | ...::open | +| test.rs:177:21:177:59 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | +| test.rs:177:21:177:60 | TryExpr | semmle.label | TryExpr | +| test.rs:178:13:178:22 | mut reader | semmle.label | mut reader | +| test.rs:178:26:178:30 | file1 | semmle.label | file1 | +| test.rs:178:26:178:43 | file1.chain(...) | semmle.label | file1.chain(...) | +| test.rs:178:38:178:42 | file2 | semmle.label | file2 | +| test.rs:179:9:179:14 | reader | semmle.label | reader | +| test.rs:179:31:179:41 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:179:36:179:41 | [post] buffer | semmle.label | [post] buffer | +| test.rs:180:14:180:20 | &buffer | semmle.label | &buffer | +| test.rs:180:15:180:20 | buffer | semmle.label | buffer | +| test.rs:185:13:185:17 | file1 | semmle.label | file1 | +| test.rs:185:21:185:39 | ...::open | semmle.label | ...::open | +| test.rs:185:21:185:51 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | +| test.rs:185:21:185:52 | TryExpr | semmle.label | TryExpr | +| test.rs:186:13:186:22 | mut reader | semmle.label | mut reader | +| test.rs:186:26:186:30 | file1 | semmle.label | file1 | +| test.rs:186:26:186:40 | file1.take(...) | semmle.label | file1.take(...) | +| test.rs:187:9:187:14 | reader | semmle.label | reader | +| test.rs:187:31:187:41 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:187:36:187:41 | [post] buffer | semmle.label | [post] buffer | +| test.rs:188:14:188:20 | &buffer | semmle.label | &buffer | +| test.rs:188:15:188:20 | buffer | semmle.label | buffer | +| test.rs:197:9:197:16 | mut file | semmle.label | mut file | +| test.rs:197:20:197:40 | ...::open | semmle.label | ...::open | +| test.rs:197:20:197:52 | ...::open(...) [future, Ok] | semmle.label | ...::open(...) [future, Ok] | +| test.rs:197:20:197:58 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:197:20:197:59 | TryExpr | semmle.label | TryExpr | | test.rs:201:22:201:25 | file | semmle.label | file | -| test.rs:201:42:201:52 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:201:47:201:52 | [post] buffer | semmle.label | [post] buffer | +| test.rs:201:32:201:42 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:201:37:201:42 | [post] buffer | semmle.label | [post] buffer | | test.rs:202:14:202:20 | &buffer | semmle.label | &buffer | | test.rs:202:15:202:20 | buffer | semmle.label | buffer | -| test.rs:207:9:207:12 | file | semmle.label | file | -| test.rs:207:25:207:35 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:207:30:207:35 | [post] buffer | semmle.label | [post] buffer | +| test.rs:207:22:207:25 | file | semmle.label | file | +| test.rs:207:39:207:49 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:207:44:207:49 | [post] buffer | semmle.label | [post] buffer | | test.rs:208:14:208:20 | &buffer | semmle.label | &buffer | | test.rs:208:15:208:20 | buffer | semmle.label | buffer | -| test.rs:212:13:212:14 | v1 | semmle.label | v1 | -| test.rs:212:18:212:21 | file | semmle.label | file | -| test.rs:212:18:212:31 | file.read_u8() [future, Ok] | semmle.label | file.read_u8() [future, Ok] | -| test.rs:212:18:212:37 | await ... [Ok] | semmle.label | await ... [Ok] | -| test.rs:212:18:212:38 | TryExpr | semmle.label | TryExpr | -| test.rs:213:13:213:14 | v2 | semmle.label | v2 | -| test.rs:213:18:213:21 | file | semmle.label | file | -| test.rs:213:18:213:32 | file.read_i16() [future, Ok] | semmle.label | file.read_i16() [future, Ok] | -| test.rs:213:18:213:38 | await ... [Ok] | semmle.label | await ... [Ok] | -| test.rs:213:18:213:39 | TryExpr | semmle.label | TryExpr | -| test.rs:214:13:214:14 | v3 | semmle.label | v3 | -| test.rs:214:18:214:21 | file | semmle.label | file | -| test.rs:214:18:214:32 | file.read_f32() [future, Ok] | semmle.label | file.read_f32() [future, Ok] | -| test.rs:214:18:214:38 | await ... [Ok] | semmle.label | await ... [Ok] | -| test.rs:214:18:214:39 | TryExpr | semmle.label | TryExpr | -| test.rs:215:13:215:14 | v4 | semmle.label | v4 | -| test.rs:215:18:215:21 | file | semmle.label | file | -| test.rs:215:18:215:35 | file.read_i64_le() [future, Ok] | semmle.label | file.read_i64_le() [future, Ok] | -| test.rs:215:18:215:41 | await ... [Ok] | semmle.label | await ... [Ok] | -| test.rs:215:18:215:42 | TryExpr | semmle.label | TryExpr | -| test.rs:216:14:216:15 | v1 | semmle.label | v1 | -| test.rs:217:14:217:15 | v2 | semmle.label | v2 | -| test.rs:218:14:218:15 | v3 | semmle.label | v3 | -| test.rs:219:14:219:15 | v4 | semmle.label | v4 | -| test.rs:224:9:224:12 | file | semmle.label | file | -| test.rs:224:23:224:33 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:224:28:224:33 | [post] buffer | semmle.label | [post] buffer | -| test.rs:225:14:225:20 | &buffer | semmle.label | &buffer | -| test.rs:225:15:225:20 | buffer | semmle.label | buffer | -| test.rs:231:13:231:18 | mut f1 | semmle.label | mut f1 | -| test.rs:231:22:231:65 | ... .open(...) [future, Ok] | semmle.label | ... .open(...) [future, Ok] | -| test.rs:231:22:231:71 | await ... [Ok] | semmle.label | await ... [Ok] | -| test.rs:231:22:231:72 | TryExpr | semmle.label | TryExpr | -| test.rs:231:52:231:55 | open | semmle.label | open | -| test.rs:233:22:233:23 | f1 | semmle.label | f1 | -| test.rs:233:30:233:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:233:35:233:40 | [post] buffer | semmle.label | [post] buffer | -| test.rs:234:14:234:20 | &buffer | semmle.label | &buffer | -| test.rs:234:15:234:20 | buffer | semmle.label | buffer | -| test.rs:262:9:262:16 | mut file | semmle.label | mut file | -| test.rs:262:20:262:44 | ...::open | semmle.label | ...::open | -| test.rs:262:20:262:56 | ...::open(...) [future, Ok] | semmle.label | ...::open(...) [future, Ok] | -| test.rs:262:20:262:62 | await ... [Ok] | semmle.label | await ... [Ok] | -| test.rs:262:20:262:63 | TryExpr | semmle.label | TryExpr | -| test.rs:266:22:266:25 | file | semmle.label | file | -| test.rs:266:32:266:42 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:266:37:266:42 | [post] buffer | semmle.label | [post] buffer | -| test.rs:267:14:267:20 | &buffer | semmle.label | &buffer | -| test.rs:267:15:267:20 | buffer | semmle.label | buffer | -| test.rs:273:13:273:18 | mut f1 | semmle.label | mut f1 | -| test.rs:273:22:273:69 | ... .open(...) [future, Ok] | semmle.label | ... .open(...) [future, Ok] | -| test.rs:273:22:273:75 | await ... [Ok] | semmle.label | await ... [Ok] | -| test.rs:273:22:273:76 | TryExpr | semmle.label | TryExpr | -| test.rs:273:56:273:59 | open | semmle.label | open | -| test.rs:275:22:275:23 | f1 | semmle.label | f1 | -| test.rs:275:30:275:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | -| test.rs:275:35:275:40 | [post] buffer | semmle.label | [post] buffer | -| test.rs:276:14:276:20 | &buffer | semmle.label | &buffer | -| test.rs:276:15:276:20 | buffer | semmle.label | buffer | +| test.rs:213:22:213:25 | file | semmle.label | file | +| test.rs:213:42:213:52 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:213:47:213:52 | [post] buffer | semmle.label | [post] buffer | +| test.rs:214:14:214:20 | &buffer | semmle.label | &buffer | +| test.rs:214:15:214:20 | buffer | semmle.label | buffer | +| test.rs:219:9:219:12 | file | semmle.label | file | +| test.rs:219:25:219:35 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:219:30:219:35 | [post] buffer | semmle.label | [post] buffer | +| test.rs:220:14:220:20 | &buffer | semmle.label | &buffer | +| test.rs:220:15:220:20 | buffer | semmle.label | buffer | +| test.rs:224:13:224:14 | v1 | semmle.label | v1 | +| test.rs:224:18:224:21 | file | semmle.label | file | +| test.rs:224:18:224:31 | file.read_u8() [future, Ok] | semmle.label | file.read_u8() [future, Ok] | +| test.rs:224:18:224:37 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:224:18:224:38 | TryExpr | semmle.label | TryExpr | +| test.rs:225:13:225:14 | v2 | semmle.label | v2 | +| test.rs:225:18:225:21 | file | semmle.label | file | +| test.rs:225:18:225:32 | file.read_i16() [future, Ok] | semmle.label | file.read_i16() [future, Ok] | +| test.rs:225:18:225:38 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:225:18:225:39 | TryExpr | semmle.label | TryExpr | +| test.rs:226:13:226:14 | v3 | semmle.label | v3 | +| test.rs:226:18:226:21 | file | semmle.label | file | +| test.rs:226:18:226:32 | file.read_f32() [future, Ok] | semmle.label | file.read_f32() [future, Ok] | +| test.rs:226:18:226:38 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:226:18:226:39 | TryExpr | semmle.label | TryExpr | +| test.rs:227:13:227:14 | v4 | semmle.label | v4 | +| test.rs:227:18:227:21 | file | semmle.label | file | +| test.rs:227:18:227:35 | file.read_i64_le() [future, Ok] | semmle.label | file.read_i64_le() [future, Ok] | +| test.rs:227:18:227:41 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:227:18:227:42 | TryExpr | semmle.label | TryExpr | +| test.rs:228:14:228:15 | v1 | semmle.label | v1 | +| test.rs:229:14:229:15 | v2 | semmle.label | v2 | +| test.rs:230:14:230:15 | v3 | semmle.label | v3 | +| test.rs:231:14:231:15 | v4 | semmle.label | v4 | +| test.rs:236:9:236:12 | file | semmle.label | file | +| test.rs:236:23:236:33 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:236:28:236:33 | [post] buffer | semmle.label | [post] buffer | +| test.rs:237:14:237:20 | &buffer | semmle.label | &buffer | +| test.rs:237:15:237:20 | buffer | semmle.label | buffer | +| test.rs:243:13:243:18 | mut f1 | semmle.label | mut f1 | +| test.rs:243:22:243:65 | ... .open(...) [future, Ok] | semmle.label | ... .open(...) [future, Ok] | +| test.rs:243:22:243:71 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:243:22:243:72 | TryExpr | semmle.label | TryExpr | +| test.rs:243:52:243:55 | open | semmle.label | open | +| test.rs:245:22:245:23 | f1 | semmle.label | f1 | +| test.rs:245:30:245:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:245:35:245:40 | [post] buffer | semmle.label | [post] buffer | +| test.rs:246:14:246:20 | &buffer | semmle.label | &buffer | +| test.rs:246:15:246:20 | buffer | semmle.label | buffer | +| test.rs:274:9:274:16 | mut file | semmle.label | mut file | +| test.rs:274:20:274:44 | ...::open | semmle.label | ...::open | +| test.rs:274:20:274:56 | ...::open(...) [future, Ok] | semmle.label | ...::open(...) [future, Ok] | +| test.rs:274:20:274:62 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:274:20:274:63 | TryExpr | semmle.label | TryExpr | +| test.rs:278:22:278:25 | file | semmle.label | file | +| test.rs:278:32:278:42 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:278:37:278:42 | [post] buffer | semmle.label | [post] buffer | +| test.rs:279:14:279:20 | &buffer | semmle.label | &buffer | +| test.rs:279:15:279:20 | buffer | semmle.label | buffer | +| test.rs:285:13:285:18 | mut f1 | semmle.label | mut f1 | +| test.rs:285:22:285:69 | ... .open(...) [future, Ok] | semmle.label | ... .open(...) [future, Ok] | +| test.rs:285:22:285:75 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:285:22:285:76 | TryExpr | semmle.label | TryExpr | +| test.rs:285:56:285:59 | open | semmle.label | open | +| test.rs:287:22:287:23 | f1 | semmle.label | f1 | +| test.rs:287:30:287:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:287:35:287:40 | [post] buffer | semmle.label | [post] buffer | +| test.rs:288:14:288:20 | &buffer | semmle.label | &buffer | +| test.rs:288:15:288:20 | buffer | semmle.label | buffer | subpaths testFailures #select | test.rs:13:14:13:19 | buffer | test.rs:12:31:12:43 | ...::read | test.rs:13:14:13:19 | buffer | $@ | test.rs:12:31:12:43 | ...::read | ...::read | | test.rs:18:14:18:19 | buffer | test.rs:17:31:17:38 | ...::read | test.rs:18:14:18:19 | buffer | $@ | test.rs:17:31:17:38 | ...::read | ...::read | | test.rs:23:14:23:19 | buffer | test.rs:22:22:22:39 | ...::read_to_string | test.rs:23:14:23:19 | buffer | $@ | test.rs:22:22:22:39 | ...::read_to_string | ...::read_to_string | -| test.rs:30:14:30:25 | path.clone() | test.rs:29:22:29:25 | path | test.rs:30:14:30:25 | path.clone() | $@ | test.rs:29:22:29:25 | path | path | -| test.rs:31:14:31:35 | ... .as_path() | test.rs:29:22:29:25 | path | test.rs:31:14:31:35 | ... .as_path() | $@ | test.rs:29:22:29:25 | path | path | -| test.rs:40:14:40:41 | ... .unwrap() | test.rs:29:22:29:25 | path | test.rs:40:14:40:41 | ... .unwrap() | $@ | test.rs:29:22:29:25 | path | path | -| test.rs:41:14:41:17 | path | test.rs:29:22:29:25 | path | test.rs:41:14:41:17 | path | $@ | test.rs:29:22:29:25 | path | path | -| test.rs:44:14:44:30 | file_name.clone() | test.rs:43:27:43:35 | file_name | test.rs:44:14:44:30 | file_name.clone() | $@ | test.rs:43:27:43:35 | file_name | file_name | -| test.rs:45:14:45:53 | ... .unwrap() | test.rs:43:27:43:35 | file_name | test.rs:45:14:45:53 | ... .unwrap() | $@ | test.rs:43:27:43:35 | file_name | file_name | -| test.rs:49:14:49:22 | file_name | test.rs:43:27:43:35 | file_name | test.rs:49:14:49:22 | file_name | $@ | test.rs:43:27:43:35 | file_name | file_name | -| test.rs:66:14:66:19 | target | test.rs:65:22:65:34 | ...::read_link | test.rs:66:14:66:19 | target | $@ | test.rs:65:22:65:34 | ...::read_link | ...::read_link | -| test.rs:75:14:75:19 | buffer | test.rs:74:31:74:45 | ...::read | test.rs:75:14:75:19 | buffer | $@ | test.rs:74:31:74:45 | ...::read | ...::read | -| test.rs:80:14:80:19 | buffer | test.rs:79:31:79:45 | ...::read | test.rs:80:14:80:19 | buffer | $@ | test.rs:79:31:79:45 | ...::read | ...::read | -| test.rs:85:14:85:19 | buffer | test.rs:84:22:84:46 | ...::read_to_string | test.rs:85:14:85:19 | buffer | $@ | test.rs:84:22:84:46 | ...::read_to_string | ...::read_to_string | -| test.rs:92:14:92:17 | path | test.rs:90:26:90:29 | path | test.rs:92:14:92:17 | path | $@ | test.rs:90:26:90:29 | path | path | -| test.rs:93:14:93:22 | file_name | test.rs:91:31:91:39 | file_name | test.rs:93:14:93:22 | file_name | $@ | test.rs:91:31:91:39 | file_name | file_name | -| test.rs:98:14:98:19 | target | test.rs:97:22:97:41 | ...::read_link | test.rs:98:14:98:19 | target | $@ | test.rs:97:22:97:41 | ...::read_link | ...::read_link | -| test.rs:112:14:112:20 | &buffer | test.rs:107:20:107:38 | ...::open | test.rs:112:14:112:20 | &buffer | $@ | test.rs:107:20:107:38 | ...::open | ...::open | -| test.rs:118:14:118:20 | &buffer | test.rs:107:20:107:38 | ...::open | test.rs:118:14:118:20 | &buffer | $@ | test.rs:107:20:107:38 | ...::open | ...::open | -| test.rs:124:14:124:20 | &buffer | test.rs:107:20:107:38 | ...::open | test.rs:124:14:124:20 | &buffer | $@ | test.rs:107:20:107:38 | ...::open | ...::open | -| test.rs:130:14:130:20 | &buffer | test.rs:107:20:107:38 | ...::open | test.rs:130:14:130:20 | &buffer | $@ | test.rs:107:20:107:38 | ...::open | ...::open | -| test.rs:134:14:134:17 | byte | test.rs:107:20:107:38 | ...::open | test.rs:134:14:134:17 | byte | $@ | test.rs:107:20:107:38 | ...::open | ...::open | -| test.rs:143:14:143:20 | &buffer | test.rs:140:50:140:53 | open | test.rs:143:14:143:20 | &buffer | $@ | test.rs:140:50:140:53 | open | open | -| test.rs:150:14:150:20 | &buffer | test.rs:147:67:147:70 | open | test.rs:150:14:150:20 | &buffer | $@ | test.rs:147:67:147:70 | open | open | -| test.rs:157:14:157:20 | &buffer | test.rs:154:101:154:104 | open | test.rs:157:14:157:20 | &buffer | $@ | test.rs:154:101:154:104 | open | open | -| test.rs:168:14:168:20 | &buffer | test.rs:164:21:164:39 | ...::open | test.rs:168:14:168:20 | &buffer | $@ | test.rs:164:21:164:39 | ...::open | ...::open | -| test.rs:168:14:168:20 | &buffer | test.rs:165:21:165:39 | ...::open | test.rs:168:14:168:20 | &buffer | $@ | test.rs:165:21:165:39 | ...::open | ...::open | -| test.rs:176:14:176:20 | &buffer | test.rs:173:21:173:39 | ...::open | test.rs:176:14:176:20 | &buffer | $@ | test.rs:173:21:173:39 | ...::open | ...::open | -| test.rs:190:14:190:20 | &buffer | test.rs:185:20:185:40 | ...::open | test.rs:190:14:190:20 | &buffer | $@ | test.rs:185:20:185:40 | ...::open | ...::open | -| test.rs:196:14:196:20 | &buffer | test.rs:185:20:185:40 | ...::open | test.rs:196:14:196:20 | &buffer | $@ | test.rs:185:20:185:40 | ...::open | ...::open | -| test.rs:202:14:202:20 | &buffer | test.rs:185:20:185:40 | ...::open | test.rs:202:14:202:20 | &buffer | $@ | test.rs:185:20:185:40 | ...::open | ...::open | -| test.rs:208:14:208:20 | &buffer | test.rs:185:20:185:40 | ...::open | test.rs:208:14:208:20 | &buffer | $@ | test.rs:185:20:185:40 | ...::open | ...::open | -| test.rs:216:14:216:15 | v1 | test.rs:185:20:185:40 | ...::open | test.rs:216:14:216:15 | v1 | $@ | test.rs:185:20:185:40 | ...::open | ...::open | -| test.rs:217:14:217:15 | v2 | test.rs:185:20:185:40 | ...::open | test.rs:217:14:217:15 | v2 | $@ | test.rs:185:20:185:40 | ...::open | ...::open | -| test.rs:218:14:218:15 | v3 | test.rs:185:20:185:40 | ...::open | test.rs:218:14:218:15 | v3 | $@ | test.rs:185:20:185:40 | ...::open | ...::open | -| test.rs:219:14:219:15 | v4 | test.rs:185:20:185:40 | ...::open | test.rs:219:14:219:15 | v4 | $@ | test.rs:185:20:185:40 | ...::open | ...::open | -| test.rs:225:14:225:20 | &buffer | test.rs:185:20:185:40 | ...::open | test.rs:225:14:225:20 | &buffer | $@ | test.rs:185:20:185:40 | ...::open | ...::open | -| test.rs:234:14:234:20 | &buffer | test.rs:231:52:231:55 | open | test.rs:234:14:234:20 | &buffer | $@ | test.rs:231:52:231:55 | open | open | -| test.rs:267:14:267:20 | &buffer | test.rs:262:20:262:44 | ...::open | test.rs:267:14:267:20 | &buffer | $@ | test.rs:262:20:262:44 | ...::open | ...::open | -| test.rs:276:14:276:20 | &buffer | test.rs:273:56:273:59 | open | test.rs:276:14:276:20 | &buffer | $@ | test.rs:273:56:273:59 | open | open | +| test.rs:31:14:31:25 | path.clone() | test.rs:30:22:30:25 | path | test.rs:31:14:31:25 | path.clone() | $@ | test.rs:30:22:30:25 | path | path | +| test.rs:32:14:32:35 | ... .as_path() | test.rs:30:22:30:25 | path | test.rs:32:14:32:35 | ... .as_path() | $@ | test.rs:30:22:30:25 | path | path | +| test.rs:33:14:33:42 | ... .into_os_string() | test.rs:30:22:30:25 | path | test.rs:33:14:33:42 | ... .into_os_string() | $@ | test.rs:30:22:30:25 | path | path | +| test.rs:34:14:34:69 | ...::from(...) | test.rs:30:22:30:25 | path | test.rs:34:14:34:69 | ...::from(...) | $@ | test.rs:30:22:30:25 | path | path | +| test.rs:35:14:35:37 | ... .as_os_str() | test.rs:30:22:30:25 | path | test.rs:35:14:35:37 | ... .as_os_str() | $@ | test.rs:30:22:30:25 | path | path | +| test.rs:36:14:36:41 | ... .as_mut_os_str() | test.rs:30:22:30:25 | path | test.rs:36:14:36:41 | ... .as_mut_os_str() | $@ | test.rs:30:22:30:25 | path | path | +| test.rs:37:14:37:26 | path.to_str() | test.rs:30:22:30:25 | path | test.rs:37:14:37:26 | path.to_str() | $@ | test.rs:30:22:30:25 | path | path | +| test.rs:38:14:38:31 | path.to_path_buf() | test.rs:30:22:30:25 | path | test.rs:38:14:38:31 | path.to_path_buf() | $@ | test.rs:30:22:30:25 | path | path | +| test.rs:39:14:39:38 | ... .unwrap() | test.rs:30:22:30:25 | path | test.rs:39:14:39:38 | ... .unwrap() | $@ | test.rs:30:22:30:25 | path | path | +| test.rs:40:14:40:38 | ... .unwrap() | test.rs:30:22:30:25 | path | test.rs:40:14:40:38 | ... .unwrap() | $@ | test.rs:30:22:30:25 | path | path | +| test.rs:41:14:41:41 | ... .unwrap() | test.rs:30:22:30:25 | path | test.rs:41:14:41:41 | ... .unwrap() | $@ | test.rs:30:22:30:25 | path | path | +| test.rs:42:14:42:17 | path | test.rs:30:22:30:25 | path | test.rs:42:14:42:17 | path | $@ | test.rs:30:22:30:25 | path | path | +| test.rs:45:14:45:30 | file_name.clone() | test.rs:44:27:44:35 | file_name | test.rs:45:14:45:30 | file_name.clone() | $@ | test.rs:44:27:44:35 | file_name | file_name | +| test.rs:46:14:46:53 | ... .unwrap() | test.rs:44:27:44:35 | file_name | test.rs:46:14:46:53 | ... .unwrap() | $@ | test.rs:44:27:44:35 | file_name | file_name | +| test.rs:47:14:47:40 | ... .unwrap() | test.rs:44:27:44:35 | file_name | test.rs:47:14:47:40 | ... .unwrap() | $@ | test.rs:44:27:44:35 | file_name | file_name | +| test.rs:48:14:48:49 | ... .to_mut() | test.rs:44:27:44:35 | file_name | test.rs:48:14:48:49 | ... .to_mut() | $@ | test.rs:44:27:44:35 | file_name | file_name | +| test.rs:49:14:49:49 | ... .as_encoded_bytes() | test.rs:44:27:44:35 | file_name | test.rs:49:14:49:49 | ... .as_encoded_bytes() | $@ | test.rs:44:27:44:35 | file_name | file_name | +| test.rs:50:14:50:22 | file_name | test.rs:44:27:44:35 | file_name | test.rs:50:14:50:22 | file_name | $@ | test.rs:44:27:44:35 | file_name | file_name | +| test.rs:69:14:69:19 | target | test.rs:68:22:68:34 | ...::read_link | test.rs:69:14:69:19 | target | $@ | test.rs:68:22:68:34 | ...::read_link | ...::read_link | +| test.rs:78:14:78:19 | buffer | test.rs:77:31:77:45 | ...::read | test.rs:78:14:78:19 | buffer | $@ | test.rs:77:31:77:45 | ...::read | ...::read | +| test.rs:83:14:83:19 | buffer | test.rs:82:31:82:45 | ...::read | test.rs:83:14:83:19 | buffer | $@ | test.rs:82:31:82:45 | ...::read | ...::read | +| test.rs:88:14:88:19 | buffer | test.rs:87:22:87:46 | ...::read_to_string | test.rs:88:14:88:19 | buffer | $@ | test.rs:87:22:87:46 | ...::read_to_string | ...::read_to_string | +| test.rs:95:14:95:17 | path | test.rs:93:26:93:29 | path | test.rs:95:14:95:17 | path | $@ | test.rs:93:26:93:29 | path | path | +| test.rs:96:14:96:22 | file_name | test.rs:94:31:94:39 | file_name | test.rs:96:14:96:22 | file_name | $@ | test.rs:94:31:94:39 | file_name | file_name | +| test.rs:101:14:101:19 | target | test.rs:100:22:100:41 | ...::read_link | test.rs:101:14:101:19 | target | $@ | test.rs:100:22:100:41 | ...::read_link | ...::read_link | +| test.rs:115:14:115:20 | &buffer | test.rs:110:20:110:38 | ...::open | test.rs:115:14:115:20 | &buffer | $@ | test.rs:110:20:110:38 | ...::open | ...::open | +| test.rs:121:14:121:20 | &buffer | test.rs:110:20:110:38 | ...::open | test.rs:121:14:121:20 | &buffer | $@ | test.rs:110:20:110:38 | ...::open | ...::open | +| test.rs:127:14:127:20 | &buffer | test.rs:110:20:110:38 | ...::open | test.rs:127:14:127:20 | &buffer | $@ | test.rs:110:20:110:38 | ...::open | ...::open | +| test.rs:133:14:133:20 | &buffer | test.rs:110:20:110:38 | ...::open | test.rs:133:14:133:20 | &buffer | $@ | test.rs:110:20:110:38 | ...::open | ...::open | +| test.rs:137:14:137:17 | byte | test.rs:110:20:110:38 | ...::open | test.rs:137:14:137:17 | byte | $@ | test.rs:110:20:110:38 | ...::open | ...::open | +| test.rs:146:14:146:20 | &buffer | test.rs:143:50:143:53 | open | test.rs:146:14:146:20 | &buffer | $@ | test.rs:143:50:143:53 | open | open | +| test.rs:156:14:156:20 | &buffer | test.rs:152:14:152:17 | open | test.rs:156:14:156:20 | &buffer | $@ | test.rs:152:14:152:17 | open | open | +| test.rs:169:14:169:20 | &buffer | test.rs:165:14:165:17 | open | test.rs:169:14:169:20 | &buffer | $@ | test.rs:165:14:165:17 | open | open | +| test.rs:180:14:180:20 | &buffer | test.rs:176:21:176:39 | ...::open | test.rs:180:14:180:20 | &buffer | $@ | test.rs:176:21:176:39 | ...::open | ...::open | +| test.rs:180:14:180:20 | &buffer | test.rs:177:21:177:39 | ...::open | test.rs:180:14:180:20 | &buffer | $@ | test.rs:177:21:177:39 | ...::open | ...::open | +| test.rs:188:14:188:20 | &buffer | test.rs:185:21:185:39 | ...::open | test.rs:188:14:188:20 | &buffer | $@ | test.rs:185:21:185:39 | ...::open | ...::open | +| test.rs:202:14:202:20 | &buffer | test.rs:197:20:197:40 | ...::open | test.rs:202:14:202:20 | &buffer | $@ | test.rs:197:20:197:40 | ...::open | ...::open | +| test.rs:208:14:208:20 | &buffer | test.rs:197:20:197:40 | ...::open | test.rs:208:14:208:20 | &buffer | $@ | test.rs:197:20:197:40 | ...::open | ...::open | +| test.rs:214:14:214:20 | &buffer | test.rs:197:20:197:40 | ...::open | test.rs:214:14:214:20 | &buffer | $@ | test.rs:197:20:197:40 | ...::open | ...::open | +| test.rs:220:14:220:20 | &buffer | test.rs:197:20:197:40 | ...::open | test.rs:220:14:220:20 | &buffer | $@ | test.rs:197:20:197:40 | ...::open | ...::open | +| test.rs:228:14:228:15 | v1 | test.rs:197:20:197:40 | ...::open | test.rs:228:14:228:15 | v1 | $@ | test.rs:197:20:197:40 | ...::open | ...::open | +| test.rs:229:14:229:15 | v2 | test.rs:197:20:197:40 | ...::open | test.rs:229:14:229:15 | v2 | $@ | test.rs:197:20:197:40 | ...::open | ...::open | +| test.rs:230:14:230:15 | v3 | test.rs:197:20:197:40 | ...::open | test.rs:230:14:230:15 | v3 | $@ | test.rs:197:20:197:40 | ...::open | ...::open | +| test.rs:231:14:231:15 | v4 | test.rs:197:20:197:40 | ...::open | test.rs:231:14:231:15 | v4 | $@ | test.rs:197:20:197:40 | ...::open | ...::open | +| test.rs:237:14:237:20 | &buffer | test.rs:197:20:197:40 | ...::open | test.rs:237:14:237:20 | &buffer | $@ | test.rs:197:20:197:40 | ...::open | ...::open | +| test.rs:246:14:246:20 | &buffer | test.rs:243:52:243:55 | open | test.rs:246:14:246:20 | &buffer | $@ | test.rs:243:52:243:55 | open | open | +| test.rs:279:14:279:20 | &buffer | test.rs:274:20:274:44 | ...::open | test.rs:279:14:279:20 | &buffer | $@ | test.rs:274:20:274:44 | ...::open | ...::open | +| test.rs:288:14:288:20 | &buffer | test.rs:285:56:285:59 | open | test.rs:288:14:288:20 | &buffer | $@ | test.rs:285:56:285:59 | open | open | diff --git a/rust/ql/test/library-tests/dataflow/sources/file/TaintSources.expected b/rust/ql/test/library-tests/dataflow/sources/file/TaintSources.expected index dd1b94de717f..dc17269abe81 100644 --- a/rust/ql/test/library-tests/dataflow/sources/file/TaintSources.expected +++ b/rust/ql/test/library-tests/dataflow/sources/file/TaintSources.expected @@ -1,33 +1,33 @@ | test.rs:12:31:12:43 | ...::read | Flow source 'FileSource' of type file (DEFAULT). | | test.rs:17:31:17:38 | ...::read | Flow source 'FileSource' of type file (DEFAULT). | | test.rs:22:22:22:39 | ...::read_to_string | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:26:18:26:29 | ...::read_dir | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:29:22:29:25 | path | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:43:27:43:35 | file_name | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:51:52:51:59 | read_dir | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:54:22:54:25 | path | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:55:27:55:35 | file_name | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:57:56:57:63 | read_dir | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:60:22:60:25 | path | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:61:27:61:35 | file_name | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:65:22:65:34 | ...::read_link | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:74:31:74:45 | ...::read | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:79:31:79:45 | ...::read | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:84:22:84:46 | ...::read_to_string | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:90:26:90:29 | path | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:91:31:91:39 | file_name | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:97:22:97:41 | ...::read_link | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:107:20:107:38 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:140:50:140:53 | open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:147:67:147:70 | open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:154:101:154:104 | open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:164:21:164:39 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:165:21:165:39 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:173:21:173:39 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:185:20:185:40 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:231:52:231:55 | open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:241:21:241:41 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:242:21:242:41 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:250:21:250:41 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:262:20:262:44 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | -| test.rs:273:56:273:59 | open | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:27:26:27:37 | ...::read_dir | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:30:22:30:25 | path | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:44:27:44:35 | file_name | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:53:60:53:67 | read_dir | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:56:22:56:25 | path | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:57:27:57:35 | file_name | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:60:64:60:71 | read_dir | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:63:22:63:25 | path | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:64:27:64:35 | file_name | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:68:22:68:34 | ...::read_link | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:77:31:77:45 | ...::read | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:82:31:82:45 | ...::read | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:87:22:87:46 | ...::read_to_string | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:93:26:93:29 | path | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:94:31:94:39 | file_name | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:100:22:100:41 | ...::read_link | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:110:20:110:38 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:143:50:143:53 | open | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:152:14:152:17 | open | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:165:14:165:17 | open | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:176:21:176:39 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:177:21:177:39 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:185:21:185:39 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:197:20:197:40 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:243:52:243:55 | open | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:253:21:253:41 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:254:21:254:41 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:262:21:262:41 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:274:20:274:44 | ...::open | Flow source 'FileSource' of type file (DEFAULT). | +| test.rs:285:56:285:59 | open | Flow source 'FileSource' of type file (DEFAULT). | diff --git a/rust/ql/test/library-tests/dataflow/sources/file/test.rs b/rust/ql/test/library-tests/dataflow/sources/file/test.rs index 18090a545681..5752c07f4d9b 100644 --- a/rust/ql/test/library-tests/dataflow/sources/file/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/file/test.rs @@ -1,11 +1,11 @@ -fn sink(_: T) { } +fn sink(_: T) {} // --- tests --- +use async_std::io::ReadExt; use std::fs; use std::io::Read; use tokio::io::AsyncReadExt; -use async_std::io::ReadExt; fn test_fs() -> Result<(), Box> { { @@ -23,43 +23,46 @@ fn test_fs() -> Result<(), Box> { sink(buffer); // $ hasTaintFlow="file.txt" } - for entry in fs::read_dir("directory")? { // $ Alert[rust/summary/taint-sources] + #[rustfmt::skip] + let _ = for entry in fs::read_dir("directory")? { // $ Alert[rust/summary/taint-sources] let e = entry?; let path = e.path(); // $ Alert[rust/summary/taint-sources] sink(path.clone()); // $ hasTaintFlow sink(path.clone().as_path()); // $ hasTaintFlow - sink(path.clone().into_os_string()); // $ MISSING: hasTaintFlow - sink(std::path::PathBuf::from(path.clone().into_boxed_path())); // $ MISSING: hasTaintFlow - sink(path.clone().as_os_str()); // $ MISSING: hasTaintFlow - sink(path.clone().as_mut_os_str()); // $ MISSING: hasTaintFlow - sink(path.to_str()); // $ MISSING: hasTaintFlow - sink(path.to_path_buf()); // $ MISSING: hasTaintFlow - sink(path.file_name().unwrap()); // $ MISSING: hasTaintFlow - sink(path.extension().unwrap()); // $ MISSING: hasTaintFlow + sink(path.clone().into_os_string()); // $ hasTaintFlow + sink(std::path::PathBuf::from(path.clone().into_boxed_path())); // $ hasTaintFlow + sink(path.clone().as_os_str()); // $ hasTaintFlow + sink(path.clone().as_mut_os_str()); // $ hasTaintFlow + sink(path.to_str()); // $ hasTaintFlow + sink(path.to_path_buf()); // $ hasTaintFlow + sink(path.file_name().unwrap()); // $ hasTaintFlow + sink(path.extension().unwrap()); // $ hasTaintFlow sink(path.canonicalize().unwrap()); // $ hasTaintFlow sink(path); // $ hasTaintFlow let file_name = e.file_name(); // $ Alert[rust/summary/taint-sources] sink(file_name.clone()); // $ hasTaintFlow sink(file_name.clone().into_string().unwrap()); // $ hasTaintFlow - sink(file_name.to_str().unwrap()); // $ MISSING: hasTaintFlow - sink(file_name.to_string_lossy().to_mut()); // $ MISSING: hasTaintFlow - sink(file_name.clone().as_encoded_bytes()); // $ MISSING: hasTaintFlow + sink(file_name.to_str().unwrap()); // $ hasTaintFlow + sink(file_name.to_string_lossy().to_mut()); // $ hasTaintFlow + sink(file_name.clone().as_encoded_bytes()); // $ hasTaintFlow sink(file_name); // $ hasTaintFlow - } - for entry in std::path::Path::new("directory").read_dir()? { // $ Alert[rust/summary/taint-sources] + }; + #[rustfmt::skip] + let _ = for entry in std::path::Path::new("directory").read_dir()? { // $ Alert[rust/summary/taint-sources] let e = entry?; let path = e.path(); // $ Alert[rust/summary/taint-sources] let file_name = e.file_name(); // $ Alert[rust/summary/taint-sources] - } - for entry in std::path::PathBuf::from("directory").read_dir()? { // $ Alert[rust/summary/taint-sources] + }; + #[rustfmt::skip] + let _ = for entry in std::path::PathBuf::from("directory").read_dir()? { // $ Alert[rust/summary/taint-sources] let e = entry?; let path = e.path(); // $ Alert[rust/summary/taint-sources] let file_name = e.file_name(); // $ Alert[rust/summary/taint-sources] - } + }; { let target = fs::read_link("symlink.txt")?; // $ Alert[rust/summary/taint-sources] @@ -144,14 +147,23 @@ fn test_io_file() -> std::io::Result<()> { } { - let mut f2 = std::fs::OpenOptions::new().create_new(true).open("f2.txt").unwrap(); // $ Alert[rust/summary/taint-sources] + let mut f2 = std::fs::OpenOptions::new() + .create_new(true) + .open("f2.txt") // $ Alert[rust/summary/taint-sources] + .unwrap(); let mut buffer = [0u8; 1024]; let _bytes = f2.read(&mut buffer)?; sink(&buffer); // $ hasTaintFlow="f2.txt" } { - let mut f3 = std::fs::OpenOptions::new().read(true).write(true).truncate(true).create(true).open("f3.txt").unwrap(); // $ Alert[rust/summary/taint-sources] + let mut f3 = std::fs::OpenOptions::new() + .read(true) + .write(true) + .truncate(true) + .create(true) + .open("f3.txt") // $ Alert[rust/summary/taint-sources] + .unwrap(); let mut buffer = [0u8; 1024]; let _bytes = f3.read(&mut buffer)?; sink(&buffer); // $ hasTaintFlow="f3.txt" From 609eb17e3027d39cad523416a34016c198a8b0cc Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 8 Jan 2026 15:00:42 +0100 Subject: [PATCH 4/5] Rust: Add more models --- rust/ql/lib/codeql/rust/frameworks/http.model.yml | 7 +++++++ rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml | 1 + rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml | 2 ++ rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml | 1 + 4 files changed, 11 insertions(+) diff --git a/rust/ql/lib/codeql/rust/frameworks/http.model.yml b/rust/ql/lib/codeql/rust/frameworks/http.model.yml index 6a497f346473..5c527cc1d409 100644 --- a/rust/ql/lib/codeql/rust/frameworks/http.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/http.model.yml @@ -1,4 +1,11 @@ extensions: + - addsTo: + pack: codeql/rust-all + extensible: summaryModel + data: + - ["::body", "Argument[self].Reference.Field[http::response::Response::body]", "ReturnValue.Reference", "value", "manual"] + - ["::body_mut", "Argument[self].Reference.Field[http::response::Response::body]", "ReturnValue.Reference", "value", "manual"] + - ["::into_body", "Argument[self].Field[http::response::Response::body]", "ReturnValue", "value", "manual"] - addsTo: pack: codeql/rust-all extensible: sourceModel diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml index cfaef568f1f6..845797435636 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml @@ -55,3 +55,4 @@ extensions: - ["::add", "Argument[0].Reference", "ReturnValue", "taint", "manual"] # Vec - ["alloc::vec::from_elem", "Argument[0]", "ReturnValue.Element", "value", "manual"] + - ["::deref", "Argument[self].Reference.Element", "ReturnValue.Reference.Element", "value", "manual"] \ No newline at end of file diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml index 0844dae56120..3ff02d732b00 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml @@ -123,6 +123,8 @@ extensions: - ["<_ as core::cmp::Ord>::min", "Argument[self,0]", "ReturnValue", "value", "manual"] - ["<_ as core::cmp::Ord>::max", "Argument[self,0]", "ReturnValue", "value", "manual"] - ["<_ as core::cmp::Ord>::clamp", "Argument[self,0,1]", "ReturnValue", "value", "manual"] + # Slice + - ["<[]>::get", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "value", "manual"] - addsTo: pack: codeql/rust-all extensible: sourceModel diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml index 064c2cd19cf0..afb6757ef66e 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml @@ -24,4 +24,5 @@ extensions: - ["<_ as std::io::Read>::chain", "Argument[0]", "ReturnValue", "taint", "manual"] - ["<_ as std::io::Read>::take", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::lock", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - ["::next", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "value", "manual"] From f3d78a4e0bcc60bcd11199bc6357d83379851872 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 8 Jan 2026 21:09:55 +0100 Subject: [PATCH 5/5] Rust: Update expected test output --- .../dataflow/sources/net/InlineFlow.expected | 68 +++++++---- .../dataflow/sources/net/test.rs | 6 +- .../security/CWE-117/LogInjection.expected | 114 ++++++++++++++++-- .../test/query-tests/security/CWE-117/main.rs | 16 +-- .../CWE-295/DisabledCertificateCheck.expected | 46 +++++-- .../test/query-tests/security/CWE-295/main.rs | 4 +- 6 files changed, 198 insertions(+), 56 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected index d9f811bd3412..31a415224500 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected @@ -28,46 +28,49 @@ models | 27 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | | 28 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | | 29 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 30 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 31 | Summary: ::chunk; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 32 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 33 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 34 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 35 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 36 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 37 | Summary: ::peek; Argument[self].Reference; Argument[0].Reference; taint | -| 38 | Summary: ::try_read; Argument[self].Reference; Argument[0].Reference; taint | -| 39 | Summary: ::try_read_buf; Argument[self].Reference; Argument[0].Reference; taint | +| 30 | Summary: ::body; Argument[self].Reference.Field[http::response::Response::body]; ReturnValue.Reference; value | +| 31 | Summary: ::body_mut; Argument[self].Reference.Field[http::response::Response::body]; ReturnValue.Reference; value | +| 32 | Summary: ::into_body; Argument[self].Field[http::response::Response::body]; ReturnValue; value | +| 33 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 34 | Summary: ::chunk; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 35 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 36 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 37 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 38 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 39 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 40 | Summary: ::peek; Argument[self].Reference; Argument[0].Reference; taint | +| 41 | Summary: ::try_read; Argument[self].Reference; Argument[0].Reference; taint | +| 42 | Summary: ::try_read_buf; Argument[self].Reference; Argument[0].Reference; taint | edges | test.rs:11:9:11:22 | remote_string1 | test.rs:12:10:12:23 | remote_string1 | provenance | | | test.rs:11:26:11:47 | ...::get | test.rs:11:26:11:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | | test.rs:11:26:11:62 | ...::get(...) [Ok] | test.rs:11:26:11:63 | TryExpr | provenance | | -| test.rs:11:26:11:63 | TryExpr | test.rs:11:26:11:70 | ... .text() [Ok] | provenance | MaD:34 | +| test.rs:11:26:11:63 | TryExpr | test.rs:11:26:11:70 | ... .text() [Ok] | provenance | MaD:37 | | test.rs:11:26:11:70 | ... .text() [Ok] | test.rs:11:26:11:71 | TryExpr | provenance | | | test.rs:11:26:11:71 | TryExpr | test.rs:11:9:11:22 | remote_string1 | provenance | | | test.rs:14:9:14:22 | remote_string2 | test.rs:15:10:15:23 | remote_string2 | provenance | | | test.rs:14:26:14:47 | ...::get | test.rs:14:26:14:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | | test.rs:14:26:14:62 | ...::get(...) [Ok] | test.rs:14:26:14:71 | ... .unwrap() | provenance | MaD:27 | -| test.rs:14:26:14:71 | ... .unwrap() | test.rs:14:26:14:78 | ... .text() [Ok] | provenance | MaD:34 | +| test.rs:14:26:14:71 | ... .unwrap() | test.rs:14:26:14:78 | ... .text() [Ok] | provenance | MaD:37 | | test.rs:14:26:14:78 | ... .text() [Ok] | test.rs:14:26:14:87 | ... .unwrap() | provenance | MaD:27 | | test.rs:14:26:14:87 | ... .unwrap() | test.rs:14:9:14:22 | remote_string2 | provenance | | | test.rs:17:9:17:22 | remote_string3 | test.rs:18:10:18:23 | remote_string3 | provenance | | | test.rs:17:26:17:47 | ...::get | test.rs:17:26:17:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | | test.rs:17:26:17:62 | ...::get(...) [Ok] | test.rs:17:26:17:71 | ... .unwrap() | provenance | MaD:27 | -| test.rs:17:26:17:71 | ... .unwrap() | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:35 | +| test.rs:17:26:17:71 | ... .unwrap() | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:38 | | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | test.rs:17:26:17:107 | ... .unwrap() | provenance | MaD:27 | | test.rs:17:26:17:107 | ... .unwrap() | test.rs:17:9:17:22 | remote_string3 | provenance | | | test.rs:20:9:20:22 | remote_string4 | test.rs:21:10:21:23 | remote_string4 | provenance | | | test.rs:20:26:20:47 | ...::get | test.rs:20:26:20:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | | test.rs:20:26:20:62 | ...::get(...) [Ok] | test.rs:20:26:20:71 | ... .unwrap() | provenance | MaD:27 | -| test.rs:20:26:20:71 | ... .unwrap() | test.rs:20:26:20:79 | ... .bytes() [Ok] | provenance | MaD:33 | +| test.rs:20:26:20:71 | ... .unwrap() | test.rs:20:26:20:79 | ... .bytes() [Ok] | provenance | MaD:36 | | test.rs:20:26:20:79 | ... .bytes() [Ok] | test.rs:20:26:20:88 | ... .unwrap() | provenance | MaD:27 | | test.rs:20:26:20:88 | ... .unwrap() | test.rs:20:9:20:22 | remote_string4 | provenance | | | test.rs:23:9:23:22 | remote_string5 | test.rs:24:10:24:23 | remote_string5 | provenance | | | test.rs:23:26:23:37 | ...::get | test.rs:23:26:23:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:8 | | test.rs:23:26:23:52 | ...::get(...) [future, Ok] | test.rs:23:26:23:58 | await ... [Ok] | provenance | | | test.rs:23:26:23:58 | await ... [Ok] | test.rs:23:26:23:59 | TryExpr | provenance | | -| test.rs:23:26:23:59 | TryExpr | test.rs:23:26:23:66 | ... .text() [future, Ok] | provenance | MaD:32 | +| test.rs:23:26:23:59 | TryExpr | test.rs:23:26:23:66 | ... .text() [future, Ok] | provenance | MaD:35 | | test.rs:23:26:23:66 | ... .text() [future, Ok] | test.rs:23:26:23:72 | await ... [Ok] | provenance | | | test.rs:23:26:23:72 | await ... [Ok] | test.rs:23:26:23:73 | TryExpr | provenance | | | test.rs:23:26:23:73 | TryExpr | test.rs:23:9:23:22 | remote_string5 | provenance | | @@ -75,7 +78,7 @@ edges | test.rs:26:26:26:37 | ...::get | test.rs:26:26:26:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:8 | | test.rs:26:26:26:52 | ...::get(...) [future, Ok] | test.rs:26:26:26:58 | await ... [Ok] | provenance | | | test.rs:26:26:26:58 | await ... [Ok] | test.rs:26:26:26:59 | TryExpr | provenance | | -| test.rs:26:26:26:59 | TryExpr | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | provenance | MaD:30 | +| test.rs:26:26:26:59 | TryExpr | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | provenance | MaD:33 | | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | test.rs:26:26:26:73 | await ... [Ok] | provenance | | | test.rs:26:26:26:73 | await ... [Ok] | test.rs:26:26:26:74 | TryExpr | provenance | | | test.rs:26:26:26:74 | TryExpr | test.rs:26:9:26:22 | remote_string6 | provenance | | @@ -85,13 +88,13 @@ edges | test.rs:29:24:29:50 | ...::get(...) [future, Ok] | test.rs:29:24:29:56 | await ... [Ok] | provenance | | | test.rs:29:24:29:56 | await ... [Ok] | test.rs:29:24:29:57 | TryExpr | provenance | | | test.rs:29:24:29:57 | TryExpr | test.rs:29:9:29:20 | mut request1 | provenance | | -| test.rs:30:10:30:17 | request1 | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:31 | +| test.rs:30:10:30:17 | request1 | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:34 | | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | test.rs:30:10:30:31 | await ... [Ok, Some] | provenance | | | test.rs:30:10:30:31 | await ... [Ok, Some] | test.rs:30:10:30:32 | TryExpr [Some] | provenance | | | test.rs:30:10:30:32 | TryExpr [Some] | test.rs:30:10:30:41 | ... .unwrap() | provenance | MaD:24 | | test.rs:31:15:31:25 | Some(...) [Some] | test.rs:31:20:31:24 | chunk | provenance | | | test.rs:31:20:31:24 | chunk | test.rs:32:14:32:18 | chunk | provenance | | -| test.rs:31:29:31:36 | request1 | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:31 | +| test.rs:31:29:31:36 | request1 | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:34 | | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | test.rs:31:29:31:50 | await ... [Ok, Some] | provenance | | | test.rs:31:29:31:50 | await ... [Ok, Some] | test.rs:31:29:31:51 | TryExpr [Some] | provenance | | | test.rs:31:29:31:51 | TryExpr [Some] | test.rs:31:15:31:25 | Some(...) [Some] | provenance | | @@ -103,11 +106,20 @@ edges | test.rs:60:31:60:42 | send_request | test.rs:60:24:60:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:2 | | test.rs:61:15:61:22 | response | test.rs:61:14:61:22 | &response | provenance | | | test.rs:67:9:67:20 | mut response | test.rs:68:11:68:18 | response | provenance | | +| test.rs:67:9:67:20 | mut response | test.rs:76:18:76:25 | response | provenance | | +| test.rs:67:9:67:20 | mut response | test.rs:77:18:77:25 | response | provenance | | +| test.rs:67:9:67:20 | mut response | test.rs:79:24:79:31 | response | provenance | | | test.rs:67:24:67:51 | sender.send_request(...) [future, Ok] | test.rs:67:24:67:57 | await ... [Ok] | provenance | | | test.rs:67:24:67:57 | await ... [Ok] | test.rs:67:24:67:58 | TryExpr | provenance | | | test.rs:67:24:67:58 | TryExpr | test.rs:67:9:67:20 | mut response | provenance | | | test.rs:67:31:67:42 | send_request | test.rs:67:24:67:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:2 | | test.rs:68:11:68:18 | response | test.rs:68:10:68:18 | &response | provenance | | +| test.rs:76:18:76:25 | response | test.rs:76:18:76:32 | response.body() | provenance | MaD:30 | +| test.rs:77:18:77:25 | response | test.rs:77:18:77:36 | response.body_mut() | provenance | MaD:31 | +| test.rs:79:17:79:20 | body | test.rs:80:19:80:22 | body | provenance | | +| test.rs:79:24:79:31 | response | test.rs:79:24:79:43 | response.into_body() | provenance | MaD:32 | +| test.rs:79:24:79:43 | response.into_body() | test.rs:79:17:79:20 | body | provenance | | +| test.rs:80:19:80:22 | body | test.rs:80:18:80:22 | &body | provenance | | | test.rs:155:13:155:22 | mut stream | test.rs:162:17:162:22 | stream | provenance | | | test.rs:155:26:155:53 | ...::connect | test.rs:155:26:155:62 | ...::connect(...) [Ok] | provenance | Src:MaD:4 | | test.rs:155:26:155:62 | ...::connect(...) [Ok] | test.rs:155:26:155:63 | TryExpr | provenance | | @@ -125,7 +137,7 @@ edges | test.rs:182:21:182:30 | mut reader | test.rs:185:27:185:32 | reader | provenance | | | test.rs:182:34:182:64 | ...::new(...) | test.rs:182:34:182:74 | ... .take(...) | provenance | MaD:22 | | test.rs:182:34:182:74 | ... .take(...) | test.rs:182:21:182:30 | mut reader | provenance | | -| test.rs:182:58:182:63 | stream | test.rs:182:34:182:64 | ...::new(...) | provenance | MaD:36 | +| test.rs:182:58:182:63 | stream | test.rs:182:34:182:64 | ...::new(...) | provenance | MaD:39 | | test.rs:185:27:185:32 | reader | test.rs:185:44:185:52 | [post] &mut line [&ref] | provenance | MaD:18 | | test.rs:185:44:185:52 | [post] &mut line [&ref] | test.rs:185:49:185:52 | [post] line | provenance | | | test.rs:185:49:185:52 | [post] line | test.rs:192:35:192:38 | line | provenance | | @@ -138,7 +150,7 @@ edges | test.rs:224:28:224:66 | ...::connect(...) [future, Ok] | test.rs:224:28:224:72 | await ... [Ok] | provenance | | | test.rs:224:28:224:72 | await ... [Ok] | test.rs:224:28:224:73 | TryExpr | provenance | | | test.rs:224:28:224:73 | TryExpr | test.rs:224:9:224:24 | mut tokio_stream | provenance | | -| test.rs:232:17:232:28 | tokio_stream | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | provenance | MaD:37 | +| test.rs:232:17:232:28 | tokio_stream | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | provenance | MaD:40 | | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | test.rs:232:40:232:46 | [post] buffer1 | provenance | | | test.rs:232:40:232:46 | [post] buffer1 | test.rs:239:15:239:21 | buffer1 | provenance | | | test.rs:232:40:232:46 | [post] buffer1 | test.rs:240:14:240:20 | buffer1 | provenance | | @@ -150,11 +162,11 @@ edges | test.rs:240:14:240:20 | buffer1 | test.rs:240:14:240:23 | buffer1[0] | provenance | MaD:10 | | test.rs:243:15:243:21 | buffer2 | test.rs:243:14:243:21 | &buffer2 | provenance | | | test.rs:244:14:244:20 | buffer2 | test.rs:244:14:244:23 | buffer2[0] | provenance | MaD:10 | -| test.rs:252:19:252:30 | tokio_stream | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | provenance | MaD:38 | +| test.rs:252:19:252:30 | tokio_stream | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | provenance | MaD:41 | | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | test.rs:252:46:252:51 | [post] buffer | provenance | | | test.rs:252:46:252:51 | [post] buffer | test.rs:259:27:259:32 | buffer | provenance | | | test.rs:259:27:259:32 | buffer | test.rs:259:26:259:32 | &buffer | provenance | | -| test.rs:275:19:275:30 | tokio_stream | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | provenance | MaD:39 | +| test.rs:275:19:275:30 | tokio_stream | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | provenance | MaD:42 | | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | test.rs:275:50:275:55 | [post] buffer | provenance | | | test.rs:275:50:275:55 | [post] buffer | test.rs:282:27:282:32 | buffer | provenance | | | test.rs:282:27:282:32 | buffer | test.rs:282:26:282:32 | &buffer | provenance | | @@ -423,6 +435,15 @@ nodes | test.rs:67:31:67:42 | send_request | semmle.label | send_request | | test.rs:68:10:68:18 | &response | semmle.label | &response | | test.rs:68:11:68:18 | response | semmle.label | response | +| test.rs:76:18:76:25 | response | semmle.label | response | +| test.rs:76:18:76:32 | response.body() | semmle.label | response.body() | +| test.rs:77:18:77:25 | response | semmle.label | response | +| test.rs:77:18:77:36 | response.body_mut() | semmle.label | response.body_mut() | +| test.rs:79:17:79:20 | body | semmle.label | body | +| test.rs:79:24:79:31 | response | semmle.label | response | +| test.rs:79:24:79:43 | response.into_body() | semmle.label | response.into_body() | +| test.rs:80:18:80:22 | &body | semmle.label | &body | +| test.rs:80:19:80:22 | body | semmle.label | body | | test.rs:155:13:155:22 | mut stream | semmle.label | mut stream | | test.rs:155:26:155:53 | ...::connect | semmle.label | ...::connect | | test.rs:155:26:155:62 | ...::connect(...) [Ok] | semmle.label | ...::connect(...) [Ok] | @@ -668,6 +689,9 @@ testFailures | test.rs:61:14:61:22 | &response | test.rs:60:31:60:42 | send_request | test.rs:61:14:61:22 | &response | $@ | test.rs:60:31:60:42 | send_request | send_request | | test.rs:62:14:62:21 | response | test.rs:60:31:60:42 | send_request | test.rs:62:14:62:21 | response | $@ | test.rs:60:31:60:42 | send_request | send_request | | test.rs:68:10:68:18 | &response | test.rs:67:31:67:42 | send_request | test.rs:68:10:68:18 | &response | $@ | test.rs:67:31:67:42 | send_request | send_request | +| test.rs:76:18:76:32 | response.body() | test.rs:67:31:67:42 | send_request | test.rs:76:18:76:32 | response.body() | $@ | test.rs:67:31:67:42 | send_request | send_request | +| test.rs:77:18:77:36 | response.body_mut() | test.rs:67:31:67:42 | send_request | test.rs:77:18:77:36 | response.body_mut() | $@ | test.rs:67:31:67:42 | send_request | send_request | +| test.rs:80:18:80:22 | &body | test.rs:67:31:67:42 | send_request | test.rs:80:18:80:22 | &body | $@ | test.rs:67:31:67:42 | send_request | send_request | | test.rs:165:14:165:20 | &buffer | test.rs:155:26:155:53 | ...::connect | test.rs:165:14:165:20 | &buffer | $@ | test.rs:155:26:155:53 | ...::connect | ...::connect | | test.rs:166:14:166:22 | buffer[0] | test.rs:155:26:155:53 | ...::connect | test.rs:166:14:166:22 | buffer[0] | $@ | test.rs:155:26:155:53 | ...::connect | ...::connect | | test.rs:192:34:192:38 | &line | test.rs:174:26:174:61 | ...::connect_timeout | test.rs:192:34:192:38 | &line | $@ | test.rs:174:26:174:61 | ...::connect_timeout | ...::connect_timeout | diff --git a/rust/ql/test/library-tests/dataflow/sources/net/test.rs b/rust/ql/test/library-tests/dataflow/sources/net/test.rs index f029ac538052..2f51be773b77 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/net/test.rs @@ -73,11 +73,11 @@ async fn test_hyper_http(case: i64) -> Result<(), Box> { match case { 1 => { - sink(response.body()); // $ MISSING: hasTaintFlow - sink(response.body_mut()); // $ MISSING: hasTaintFlow + sink(response.body()); // $ hasTaintFlow=request + sink(response.body_mut()); // $ hasTaintFlow=request let body = response.into_body(); - sink(&body); // $ MISSING: hasTaintFlow + sink(&body); // $ hasTaintFlow=request println!("awaiting response..."); let data = body.collect().await?; diff --git a/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected b/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected index d812380d9c71..e326a87c42d8 100644 --- a/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected @@ -1,8 +1,14 @@ #select +| main.rs:15:5:15:9 | ...::log | main.rs:8:29:8:37 | ...::args | main.rs:15:5:15:9 | ...::log | Log entry depends on a $@. | main.rs:8:29:8:37 | ...::args | user-provided value | | main.rs:16:5:16:9 | ...::log | main.rs:10:22:10:34 | ...::var | main.rs:16:5:16:9 | ...::log | Log entry depends on a $@. | main.rs:10:22:10:34 | ...::var | user-provided value | | main.rs:17:5:17:10 | ...::log | main.rs:11:23:11:44 | ...::get | main.rs:17:5:17:10 | ...::log | Log entry depends on a $@. | main.rs:11:23:11:44 | ...::get | user-provided value | +| main.rs:18:5:18:10 | ...::log | main.rs:8:29:8:37 | ...::args | main.rs:18:5:18:10 | ...::log | Log entry depends on a $@. | main.rs:8:29:8:37 | ...::args | user-provided value | | main.rs:19:5:19:10 | ...::log | main.rs:10:22:10:34 | ...::var | main.rs:19:5:19:10 | ...::log | Log entry depends on a $@. | main.rs:10:22:10:34 | ...::var | user-provided value | +| main.rs:23:5:23:9 | ...::log | main.rs:8:29:8:37 | ...::args | main.rs:23:5:23:9 | ...::log | Log entry depends on a $@. | main.rs:8:29:8:37 | ...::args | user-provided value | +| main.rs:27:5:27:9 | ...::log | main.rs:8:29:8:37 | ...::args | main.rs:27:5:27:9 | ...::log | Log entry depends on a $@. | main.rs:8:29:8:37 | ...::args | user-provided value | +| main.rs:30:5:30:9 | ...::log | main.rs:8:29:8:37 | ...::args | main.rs:30:5:30:9 | ...::log | Log entry depends on a $@. | main.rs:8:29:8:37 | ...::args | user-provided value | | main.rs:30:5:30:9 | ...::log | main.rs:11:23:11:44 | ...::get | main.rs:30:5:30:9 | ...::log | Log entry depends on a $@. | main.rs:11:23:11:44 | ...::get | user-provided value | +| main.rs:66:5:66:9 | ...::log | main.rs:8:29:8:37 | ...::args | main.rs:66:5:66:9 | ...::log | Log entry depends on a $@. | main.rs:8:29:8:37 | ...::args | user-provided value | | main.rs:112:9:112:13 | ...::log | main.rs:109:25:109:38 | ...::args | main.rs:112:9:112:13 | ...::log | Log entry depends on a $@. | main.rs:109:25:109:38 | ...::args | user-provided value | | main.rs:113:9:113:13 | ...::log | main.rs:109:25:109:38 | ...::args | main.rs:113:9:113:13 | ...::log | Log entry depends on a $@. | main.rs:109:25:109:38 | ...::args | user-provided value | | main.rs:114:9:114:14 | ...::log | main.rs:109:25:109:38 | ...::args | main.rs:114:9:114:14 | ...::log | Log entry depends on a $@. | main.rs:109:25:109:38 | ...::args | user-provided value | @@ -12,22 +18,59 @@ | main.rs:126:9:126:16 | ...::_print | main.rs:123:25:123:37 | ...::var | main.rs:126:9:126:16 | ...::_print | Log entry depends on a $@. | main.rs:123:25:123:37 | ...::var | user-provided value | | main.rs:127:9:127:17 | ...::_eprint | main.rs:123:25:123:37 | ...::var | main.rs:127:9:127:17 | ...::_eprint | Log entry depends on a $@. | main.rs:123:25:123:37 | ...::var | user-provided value | edges +| main.rs:8:9:8:12 | args [element] | main.rs:9:20:9:23 | args [element] | provenance | | +| main.rs:8:29:8:37 | ...::args | main.rs:8:29:8:39 | ...::args(...) [element] | provenance | Src:MaD:5 | +| main.rs:8:29:8:39 | ...::args(...) [element] | main.rs:8:29:8:49 | ... .collect() [element] | provenance | MaD:9 | +| main.rs:8:29:8:49 | ... .collect() [element] | main.rs:8:9:8:12 | args [element] | provenance | | +| main.rs:9:9:9:16 | username | main.rs:15:11:15:36 | MacroExpr | provenance | | +| main.rs:9:9:9:16 | username | main.rs:18:12:18:37 | MacroExpr | provenance | | +| main.rs:9:9:9:16 | username | main.rs:22:33:22:63 | MacroExpr | provenance | | +| main.rs:9:9:9:16 | username | main.rs:26:55:26:62 | username | provenance | | +| main.rs:9:9:9:16 | username | main.rs:30:11:30:66 | MacroExpr | provenance | | +| main.rs:9:9:9:16 | username | main.rs:52:29:52:36 | username | provenance | | +| main.rs:9:20:9:23 | args [element] | main.rs:9:20:9:30 | args.get(...) [Some, &ref] | provenance | MaD:12 | +| main.rs:9:20:9:30 | args.get(...) [Some, &ref] | main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | provenance | MaD:13 | +| main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | main.rs:9:20:9:72 | ... .clone() | provenance | MaD:8 | +| main.rs:9:20:9:72 | ... .clone() | main.rs:9:9:9:16 | username | provenance | | | main.rs:10:9:10:18 | user_input | main.rs:16:11:16:44 | MacroExpr | provenance | | | main.rs:10:9:10:18 | user_input | main.rs:19:12:19:39 | MacroExpr | provenance | | | main.rs:10:22:10:34 | ...::var | main.rs:10:22:10:48 | ...::var(...) [Ok] | provenance | Src:MaD:6 | -| main.rs:10:22:10:48 | ...::var(...) [Ok] | main.rs:10:22:10:81 | ... .unwrap_or(...) | provenance | MaD:10 | +| main.rs:10:22:10:48 | ...::var(...) [Ok] | main.rs:10:22:10:81 | ... .unwrap_or(...) | provenance | MaD:16 | | main.rs:10:22:10:81 | ... .unwrap_or(...) | main.rs:10:9:10:18 | user_input | provenance | | | main.rs:11:9:11:19 | remote_data | main.rs:17:12:17:46 | MacroExpr | provenance | | | main.rs:11:9:11:19 | remote_data | main.rs:30:11:30:66 | MacroExpr | provenance | | | main.rs:11:23:11:44 | ...::get | main.rs:11:23:11:71 | ...::get(...) [Ok] | provenance | Src:MaD:4 | -| main.rs:11:23:11:71 | ...::get(...) [Ok] | main.rs:11:23:12:17 | ... .unwrap() | provenance | MaD:9 | -| main.rs:11:23:12:17 | ... .unwrap() | main.rs:11:23:12:24 | ... .text() [Ok] | provenance | MaD:12 | -| main.rs:11:23:12:24 | ... .text() [Ok] | main.rs:11:23:12:61 | ... .unwrap_or(...) | provenance | MaD:10 | +| main.rs:11:23:11:71 | ...::get(...) [Ok] | main.rs:11:23:12:17 | ... .unwrap() | provenance | MaD:15 | +| main.rs:11:23:12:17 | ... .unwrap() | main.rs:11:23:12:24 | ... .text() [Ok] | provenance | MaD:18 | +| main.rs:11:23:12:24 | ... .text() [Ok] | main.rs:11:23:12:61 | ... .unwrap_or(...) | provenance | MaD:16 | | main.rs:11:23:12:61 | ... .unwrap_or(...) | main.rs:11:9:11:19 | remote_data | provenance | | +| main.rs:15:11:15:36 | MacroExpr | main.rs:15:5:15:9 | ...::log | provenance | MaD:1 Sink:MaD:1 | | main.rs:16:11:16:44 | MacroExpr | main.rs:16:5:16:9 | ...::log | provenance | MaD:1 Sink:MaD:1 | | main.rs:17:12:17:46 | MacroExpr | main.rs:17:5:17:10 | ...::log | provenance | MaD:1 Sink:MaD:1 | +| main.rs:18:12:18:37 | MacroExpr | main.rs:18:5:18:10 | ...::log | provenance | MaD:1 Sink:MaD:1 | | main.rs:19:12:19:39 | MacroExpr | main.rs:19:5:19:10 | ...::log | provenance | MaD:1 Sink:MaD:1 | +| main.rs:22:9:22:21 | formatted_msg | main.rs:23:11:23:29 | MacroExpr | provenance | | +| main.rs:22:33:22:63 | ...::format(...) | main.rs:22:33:22:63 | { ... } | provenance | | +| main.rs:22:33:22:63 | ...::must_use(...) | main.rs:22:9:22:21 | formatted_msg | provenance | | +| main.rs:22:33:22:63 | MacroExpr | main.rs:22:33:22:63 | ...::format(...) | provenance | MaD:19 | +| main.rs:22:33:22:63 | { ... } | main.rs:22:33:22:63 | ...::must_use(...) | provenance | MaD:20 | +| main.rs:23:11:23:29 | MacroExpr | main.rs:23:5:23:9 | ...::log | provenance | MaD:1 Sink:MaD:1 | +| main.rs:26:9:26:18 | concat_msg | main.rs:27:11:27:26 | MacroExpr | provenance | | +| main.rs:26:22:26:62 | ... + ... | main.rs:26:9:26:18 | concat_msg | provenance | | +| main.rs:26:54:26:62 | &username [&ref] | main.rs:26:22:26:62 | ... + ... | provenance | MaD:11 | +| main.rs:26:55:26:62 | username | main.rs:26:54:26:62 | &username [&ref] | provenance | | +| main.rs:27:11:27:26 | MacroExpr | main.rs:27:5:27:9 | ...::log | provenance | MaD:1 Sink:MaD:1 | | main.rs:30:11:30:66 | MacroExpr | main.rs:30:5:30:9 | ...::log | provenance | MaD:1 Sink:MaD:1 | +| main.rs:52:28:52:36 | &username [&ref] | main.rs:56:27:56:40 | ...: ... [&ref] | provenance | | +| main.rs:52:29:52:36 | username | main.rs:52:28:52:36 | &username [&ref] | provenance | | +| main.rs:56:27:56:40 | ...: ... [&ref] | main.rs:65:38:65:45 | username [&ref] | provenance | | +| main.rs:65:9:65:17 | user_info [UserInfo] | main.rs:66:28:66:36 | user_info [UserInfo] | provenance | | +| main.rs:65:21:65:59 | UserInfo {...} [UserInfo] | main.rs:65:9:65:17 | user_info [UserInfo] | provenance | | +| main.rs:65:38:65:45 | username [&ref] | main.rs:65:38:65:57 | username.to_string() | provenance | MaD:7 | +| main.rs:65:38:65:57 | username.to_string() | main.rs:65:21:65:59 | UserInfo {...} [UserInfo] | provenance | | +| main.rs:66:11:66:41 | MacroExpr | main.rs:66:5:66:9 | ...::log | provenance | MaD:1 Sink:MaD:1 | +| main.rs:66:28:66:36 | user_info [UserInfo] | main.rs:66:28:66:41 | user_info.name | provenance | | +| main.rs:66:28:66:41 | user_info.name | main.rs:66:11:66:41 | MacroExpr | provenance | | | main.rs:109:13:109:21 | user_data | main.rs:112:15:112:35 | MacroExpr | provenance | | | main.rs:109:13:109:21 | user_data | main.rs:113:15:113:38 | MacroExpr | provenance | | | main.rs:109:13:109:21 | user_data | main.rs:114:16:114:37 | MacroExpr | provenance | | @@ -35,8 +78,8 @@ edges | main.rs:109:13:109:21 | user_data | main.rs:116:16:116:37 | MacroExpr | provenance | | | main.rs:109:13:109:21 | user_data | main.rs:119:15:119:75 | MacroExpr | provenance | | | main.rs:109:25:109:38 | ...::args | main.rs:109:25:109:40 | ...::args(...) [element] | provenance | Src:MaD:5 | -| main.rs:109:25:109:40 | ...::args(...) [element] | main.rs:109:25:109:47 | ... .nth(...) [Some] | provenance | MaD:7 | -| main.rs:109:25:109:47 | ... .nth(...) [Some] | main.rs:109:25:109:67 | ... .unwrap_or_default() | provenance | MaD:8 | +| main.rs:109:25:109:40 | ...::args(...) [element] | main.rs:109:25:109:47 | ... .nth(...) [Some] | provenance | MaD:10 | +| main.rs:109:25:109:47 | ... .nth(...) [Some] | main.rs:109:25:109:67 | ... .unwrap_or_default() | provenance | MaD:14 | | main.rs:109:25:109:67 | ... .unwrap_or_default() | main.rs:109:13:109:21 | user_data | provenance | | | main.rs:112:15:112:35 | MacroExpr | main.rs:112:9:112:13 | ...::log | provenance | MaD:1 Sink:MaD:1 | | main.rs:113:15:113:38 | MacroExpr | main.rs:113:9:113:13 | ...::log | provenance | MaD:1 Sink:MaD:1 | @@ -47,7 +90,7 @@ edges | main.rs:123:13:123:21 | user_data | main.rs:126:18:126:38 | MacroExpr | provenance | | | main.rs:123:13:123:21 | user_data | main.rs:127:19:127:49 | MacroExpr | provenance | | | main.rs:123:25:123:37 | ...::var | main.rs:123:25:123:45 | ...::var(...) [Ok] | provenance | Src:MaD:6 | -| main.rs:123:25:123:45 | ...::var(...) [Ok] | main.rs:123:25:123:65 | ... .unwrap_or_default() | provenance | MaD:11 | +| main.rs:123:25:123:45 | ...::var(...) [Ok] | main.rs:123:25:123:65 | ... .unwrap_or_default() | provenance | MaD:17 | | main.rs:123:25:123:65 | ... .unwrap_or_default() | main.rs:123:13:123:21 | user_data | provenance | | | main.rs:126:18:126:38 | MacroExpr | main.rs:126:9:126:16 | ...::_print | provenance | MaD:3 Sink:MaD:3 | | main.rs:127:19:127:49 | MacroExpr | main.rs:127:9:127:17 | ...::_eprint | provenance | MaD:2 Sink:MaD:2 | @@ -58,13 +101,30 @@ models | 4 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | | 5 | Source: std::env::args; ReturnValue.Element; commandargs | | 6 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment | -| 7 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 8 | Summary: ::unwrap_or_default; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 9 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 10 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 11 | Summary: ::unwrap_or_default; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 12 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 7 | Summary: <_ as alloc::string::ToString>::to_string; Argument[self].Reference; ReturnValue; taint | +| 8 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | +| 9 | Summary: <_ as core::iter::traits::iterator::Iterator>::collect; Argument[self].Element; ReturnValue.Element; value | +| 10 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 11 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | +| 12 | Summary: ::deref; Argument[self].Reference.Element; ReturnValue.Reference.Element; value | +| 13 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 14 | Summary: ::unwrap_or_default; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 15 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 16 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 17 | Summary: ::unwrap_or_default; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 18 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 19 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 20 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes +| main.rs:8:9:8:12 | args [element] | semmle.label | args [element] | +| main.rs:8:29:8:37 | ...::args | semmle.label | ...::args | +| main.rs:8:29:8:39 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| main.rs:8:29:8:49 | ... .collect() [element] | semmle.label | ... .collect() [element] | +| main.rs:9:9:9:16 | username | semmle.label | username | +| main.rs:9:20:9:23 | args [element] | semmle.label | args [element] | +| main.rs:9:20:9:30 | args.get(...) [Some, &ref] | semmle.label | args.get(...) [Some, &ref] | +| main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | semmle.label | ... .unwrap_or(...) [&ref] | +| main.rs:9:20:9:72 | ... .clone() | semmle.label | ... .clone() | | main.rs:10:9:10:18 | user_input | semmle.label | user_input | | main.rs:10:22:10:34 | ...::var | semmle.label | ...::var | | main.rs:10:22:10:48 | ...::var(...) [Ok] | semmle.label | ...::var(...) [Ok] | @@ -75,14 +135,42 @@ nodes | main.rs:11:23:12:17 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:11:23:12:24 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | | main.rs:11:23:12:61 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:15:5:15:9 | ...::log | semmle.label | ...::log | +| main.rs:15:11:15:36 | MacroExpr | semmle.label | MacroExpr | | main.rs:16:5:16:9 | ...::log | semmle.label | ...::log | | main.rs:16:11:16:44 | MacroExpr | semmle.label | MacroExpr | | main.rs:17:5:17:10 | ...::log | semmle.label | ...::log | | main.rs:17:12:17:46 | MacroExpr | semmle.label | MacroExpr | +| main.rs:18:5:18:10 | ...::log | semmle.label | ...::log | +| main.rs:18:12:18:37 | MacroExpr | semmle.label | MacroExpr | | main.rs:19:5:19:10 | ...::log | semmle.label | ...::log | | main.rs:19:12:19:39 | MacroExpr | semmle.label | MacroExpr | +| main.rs:22:9:22:21 | formatted_msg | semmle.label | formatted_msg | +| main.rs:22:33:22:63 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:22:33:22:63 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:22:33:22:63 | MacroExpr | semmle.label | MacroExpr | +| main.rs:22:33:22:63 | { ... } | semmle.label | { ... } | +| main.rs:23:5:23:9 | ...::log | semmle.label | ...::log | +| main.rs:23:11:23:29 | MacroExpr | semmle.label | MacroExpr | +| main.rs:26:9:26:18 | concat_msg | semmle.label | concat_msg | +| main.rs:26:22:26:62 | ... + ... | semmle.label | ... + ... | +| main.rs:26:54:26:62 | &username [&ref] | semmle.label | &username [&ref] | +| main.rs:26:55:26:62 | username | semmle.label | username | +| main.rs:27:5:27:9 | ...::log | semmle.label | ...::log | +| main.rs:27:11:27:26 | MacroExpr | semmle.label | MacroExpr | | main.rs:30:5:30:9 | ...::log | semmle.label | ...::log | | main.rs:30:11:30:66 | MacroExpr | semmle.label | MacroExpr | +| main.rs:52:28:52:36 | &username [&ref] | semmle.label | &username [&ref] | +| main.rs:52:29:52:36 | username | semmle.label | username | +| main.rs:56:27:56:40 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | +| main.rs:65:9:65:17 | user_info [UserInfo] | semmle.label | user_info [UserInfo] | +| main.rs:65:21:65:59 | UserInfo {...} [UserInfo] | semmle.label | UserInfo {...} [UserInfo] | +| main.rs:65:38:65:45 | username [&ref] | semmle.label | username [&ref] | +| main.rs:65:38:65:57 | username.to_string() | semmle.label | username.to_string() | +| main.rs:66:5:66:9 | ...::log | semmle.label | ...::log | +| main.rs:66:11:66:41 | MacroExpr | semmle.label | MacroExpr | +| main.rs:66:28:66:36 | user_info [UserInfo] | semmle.label | user_info [UserInfo] | +| main.rs:66:28:66:41 | user_info.name | semmle.label | user_info.name | | main.rs:109:13:109:21 | user_data | semmle.label | user_data | | main.rs:109:25:109:38 | ...::args | semmle.label | ...::args | | main.rs:109:25:109:40 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | diff --git a/rust/ql/test/query-tests/security/CWE-117/main.rs b/rust/ql/test/query-tests/security/CWE-117/main.rs index f5001846d1bf..9fb3558b3d27 100644 --- a/rust/ql/test/query-tests/security/CWE-117/main.rs +++ b/rust/ql/test/query-tests/security/CWE-117/main.rs @@ -5,29 +5,29 @@ fn main() { env_logger::init(); // Sources of user input - let args: Vec = env::args().collect(); - let username = args.get(1).unwrap_or(&String::from("Guest")).clone(); // $ MISSING: Source=commandargs + let args: Vec = env::args().collect(); // $ Source=commandargs + let username = args.get(1).unwrap_or(&String::from("Guest")).clone(); let user_input = std::env::var("USER_INPUT").unwrap_or("default".to_string()); // $ Source=environment let remote_data = reqwest::blocking::get("http://example.com/user") // $ Source=remote .unwrap().text().unwrap_or("remote_user".to_string()); // BAD: Direct logging of user input - info!("User login: {}", username); // $ MISSING: Alert[rust/log-injection] + info!("User login: {}", username); // $ Alert[rust/log-injection]=commandargs warn!("Warning for user: {}", user_input); // $ Alert[rust/log-injection]=environment error!("Error processing: {}", remote_data); // $ Alert[rust/log-injection]=remote - debug!("Debug info: {}", username); // $ MISSING: Alert[rust/log-injection] + debug!("Debug info: {}", username); // $ Alert[rust/log-injection]=commandargs trace!("Trace data: {}", user_input); // $ Alert[rust/log-injection]=environment // BAD: Formatted strings with user input let formatted_msg = format!("Processing user: {}", username); - info!("{}", formatted_msg); // $ MISSING: Alert[rust/log-injection] + info!("{}", formatted_msg); // $ Alert[rust/log-injection]=commandargs // BAD: String concatenation with user input let concat_msg = "User activity: ".to_string() + &username; - info!("{}", concat_msg); // $ MISSING: Alert[rust/log-injection] + info!("{}", concat_msg); // $ Alert[rust/log-injection]=commandargs // BAD: Complex formatting - info!("User {} accessed resource at {}", username, remote_data); // $ Alert[rust/log-injection]=remote + info!("User {} accessed resource at {}", username, remote_data); // $ Alert[rust/log-injection]=remote Alert[rust/log-injection]=commandargs // GOOD: Sanitized input let sanitized_username = username.replace('\n', "").replace('\r', ""); @@ -63,7 +63,7 @@ fn test_complex_scenarios(username: &str, user_input: &str) { // BAD: Through struct fields let user_info = UserInfo { name: username.to_string() }; - info!("User info: {}", user_info.name); // $ MISSING: Alert[rust/log-injection] + info!("User info: {}", user_info.name); // $ Alert[rust/log-injection]=commandargs // GOOD: After sanitization let clean_input = sanitize_input(user_input); diff --git a/rust/ql/test/query-tests/security/CWE-295/DisabledCertificateCheck.expected b/rust/ql/test/query-tests/security/CWE-295/DisabledCertificateCheck.expected index bbc67f6fd18a..dd4fd9294046 100644 --- a/rust/ql/test/query-tests/security/CWE-295/DisabledCertificateCheck.expected +++ b/rust/ql/test/query-tests/security/CWE-295/DisabledCertificateCheck.expected @@ -15,6 +15,7 @@ | main.rs:109:4:109:34 | danger_accept_invalid_hostnames | main.rs:107:17:107:31 | ...::exists | main.rs:109:4:109:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | | main.rs:115:4:115:34 | danger_accept_invalid_hostnames | main.rs:113:43:113:50 | metadata | main.rs:115:4:115:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | | main.rs:121:4:121:34 | danger_accept_invalid_hostnames | main.rs:119:11:119:27 | ...::metadata | main.rs:121:4:121:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | +| main.rs:134:4:134:34 | danger_accept_invalid_hostnames | main.rs:129:14:129:27 | ...::stdin | main.rs:134:4:134:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | | main.rs:146:4:146:34 | danger_accept_invalid_hostnames | main.rs:144:39:144:42 | true | main.rs:146:4:146:34 | danger_accept_invalid_hostnames | Disabling TLS certificate validation can expose the application to man-in-the-middle attacks. | edges | main.rs:4:32:4:35 | true | main.rs:4:4:4:30 | danger_accept_invalid_certs | provenance | MaD:1 Sink:MaD:1 | @@ -37,21 +38,33 @@ edges | main.rs:93:32:93:47 | sometimes_global | main.rs:93:4:93:30 | danger_accept_invalid_certs | provenance | MaD:1 Sink:MaD:1 | | main.rs:107:6:107:7 | b1 | main.rs:109:36:109:37 | b1 | provenance | | | main.rs:107:17:107:31 | ...::exists | main.rs:107:17:107:42 | ...::exists(...) [Ok] | provenance | Src:MaD:8 | -| main.rs:107:17:107:42 | ...::exists(...) [Ok] | main.rs:107:17:107:51 | ... .unwrap() | provenance | MaD:10 | +| main.rs:107:17:107:42 | ...::exists(...) [Ok] | main.rs:107:17:107:51 | ... .unwrap() | provenance | MaD:13 | | main.rs:107:17:107:51 | ... .unwrap() | main.rs:107:6:107:7 | b1 | provenance | | | main.rs:109:36:109:37 | b1 | main.rs:109:4:109:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | | main.rs:113:6:113:7 | b2 | main.rs:115:36:115:37 | b2 | provenance | | -| main.rs:113:11:113:52 | ... .metadata() [Ok] | main.rs:113:11:113:61 | ... .unwrap() | provenance | MaD:10 | -| main.rs:113:11:113:61 | ... .unwrap() | main.rs:113:11:113:71 | ... .is_file() | provenance | MaD:12 | +| main.rs:113:11:113:52 | ... .metadata() [Ok] | main.rs:113:11:113:61 | ... .unwrap() | provenance | MaD:13 | +| main.rs:113:11:113:61 | ... .unwrap() | main.rs:113:11:113:71 | ... .is_file() | provenance | MaD:16 | | main.rs:113:11:113:71 | ... .is_file() | main.rs:113:6:113:7 | b2 | provenance | | | main.rs:113:43:113:50 | metadata | main.rs:113:11:113:52 | ... .metadata() [Ok] | provenance | Src:MaD:7 | | main.rs:115:36:115:37 | b2 | main.rs:115:4:115:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | | main.rs:119:6:119:7 | b3 | main.rs:121:36:121:37 | b3 | provenance | | | main.rs:119:11:119:27 | ...::metadata | main.rs:119:11:119:38 | ...::metadata(...) [Ok] | provenance | Src:MaD:9 | -| main.rs:119:11:119:38 | ...::metadata(...) [Ok] | main.rs:119:11:119:47 | ... .unwrap() | provenance | MaD:10 | -| main.rs:119:11:119:47 | ... .unwrap() | main.rs:119:11:119:56 | ... .is_dir() | provenance | MaD:11 | +| main.rs:119:11:119:38 | ...::metadata(...) [Ok] | main.rs:119:11:119:47 | ... .unwrap() | provenance | MaD:13 | +| main.rs:119:11:119:47 | ... .unwrap() | main.rs:119:11:119:56 | ... .is_dir() | provenance | MaD:15 | | main.rs:119:11:119:56 | ... .is_dir() | main.rs:119:6:119:7 | b3 | provenance | | | main.rs:121:36:121:37 | b3 | main.rs:121:4:121:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | +| main.rs:129:6:129:10 | input | main.rs:130:2:130:6 | input | provenance | | +| main.rs:129:14:129:27 | ...::stdin | main.rs:129:14:129:29 | ...::stdin(...) | provenance | Src:MaD:10 MaD:10 | +| main.rs:129:14:129:29 | ...::stdin(...) | main.rs:129:6:129:10 | input | provenance | | +| main.rs:130:2:130:6 | input | main.rs:130:18:130:32 | [post] &mut input_line [&ref] | provenance | MaD:17 | +| main.rs:130:18:130:32 | [post] &mut input_line [&ref] | main.rs:130:23:130:32 | [post] input_line | provenance | | +| main.rs:130:23:130:32 | [post] input_line | main.rs:132:17:132:26 | input_line | provenance | | +| main.rs:132:6:132:7 | b4 | main.rs:134:36:134:37 | b4 | provenance | | +| main.rs:132:17:132:26 | input_line | main.rs:132:17:132:42 | input_line.parse() [Ok] | provenance | MaD:11 | +| main.rs:132:17:132:26 | input_line | main.rs:132:17:132:42 | input_line.parse() [Ok] | provenance | MaD:12 | +| main.rs:132:17:132:42 | input_line.parse() [Ok] | main.rs:132:17:132:59 | ... .unwrap_or(...) | provenance | MaD:14 | +| main.rs:132:17:132:59 | ... .unwrap_or(...) | main.rs:132:6:132:7 | b4 | provenance | | +| main.rs:134:36:134:37 | b4 | main.rs:134:4:134:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | | main.rs:144:6:144:7 | b6 | main.rs:146:36:146:37 | b6 | provenance | | | main.rs:144:39:144:42 | true | main.rs:144:6:144:7 | b6 | provenance | | | main.rs:146:36:146:37 | b6 | main.rs:146:4:146:34 | danger_accept_invalid_hostnames | provenance | MaD:2 Sink:MaD:2 | @@ -66,9 +79,14 @@ models | 7 | Source: ::metadata; ReturnValue.Field[core::result::Result::Ok(0)]; file | | 8 | Source: std::fs::exists; ReturnValue.Field[core::result::Result::Ok(0)]; file | | 9 | Source: std::fs::metadata; ReturnValue.Field[core::result::Result::Ok(0)]; file | -| 10 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 11 | Summary: ::is_dir; Argument[self].Reference; ReturnValue; taint | -| 12 | Summary: ::is_file; Argument[self].Reference; ReturnValue; taint | +| 10 | Source: std::io::stdio::stdin; ReturnValue; stdin | +| 11 | Summary: <_ as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue.Reference; taint | +| 12 | Summary: ::deref; Argument[self]; ReturnValue; value | +| 13 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 14 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 15 | Summary: ::is_dir; Argument[self].Reference; ReturnValue; taint | +| 16 | Summary: ::is_file; Argument[self].Reference; ReturnValue; taint | +| 17 | Summary: ::read_line; Argument[self].Reference; Argument[0].Reference; taint | nodes | main.rs:4:4:4:30 | danger_accept_invalid_certs | semmle.label | danger_accept_invalid_certs | | main.rs:4:32:4:35 | true | semmle.label | true | @@ -121,6 +139,18 @@ nodes | main.rs:119:11:119:56 | ... .is_dir() | semmle.label | ... .is_dir() | | main.rs:121:4:121:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | | main.rs:121:36:121:37 | b3 | semmle.label | b3 | +| main.rs:129:6:129:10 | input | semmle.label | input | +| main.rs:129:14:129:27 | ...::stdin | semmle.label | ...::stdin | +| main.rs:129:14:129:29 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| main.rs:130:2:130:6 | input | semmle.label | input | +| main.rs:130:18:130:32 | [post] &mut input_line [&ref] | semmle.label | [post] &mut input_line [&ref] | +| main.rs:130:23:130:32 | [post] input_line | semmle.label | [post] input_line | +| main.rs:132:6:132:7 | b4 | semmle.label | b4 | +| main.rs:132:17:132:26 | input_line | semmle.label | input_line | +| main.rs:132:17:132:42 | input_line.parse() [Ok] | semmle.label | input_line.parse() [Ok] | +| main.rs:132:17:132:59 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:134:4:134:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | +| main.rs:134:36:134:37 | b4 | semmle.label | b4 | | main.rs:144:6:144:7 | b6 | semmle.label | b6 | | main.rs:144:39:144:42 | true | semmle.label | true | | main.rs:146:4:146:34 | danger_accept_invalid_hostnames | semmle.label | danger_accept_invalid_hostnames | diff --git a/rust/ql/test/query-tests/security/CWE-295/main.rs b/rust/ql/test/query-tests/security/CWE-295/main.rs index 6088e6fc1bee..e8c20c1d6df3 100644 --- a/rust/ql/test/query-tests/security/CWE-295/main.rs +++ b/rust/ql/test/query-tests/security/CWE-295/main.rs @@ -126,12 +126,12 @@ fn test_threat_model_source() { // (these are a little closer to something real) let mut input_line = String::new(); - let input = std::io::stdin(); + let input = std::io::stdin(); // $ Source=stdin input.read_line(&mut input_line).unwrap(); let b4: bool = input_line.parse::().unwrap_or(false); let _client = native_tls::TlsConnector::builder() - .danger_accept_invalid_hostnames(b4) // $ MISSING: Alert[rust/disabled-certificate-check]=stdin + .danger_accept_invalid_hostnames(b4) // $ Alert[rust/disabled-certificate-check]=stdin .build() .unwrap();