diff --git a/rust/ql/lib/change-notes/2025-11-19-models.md b/rust/ql/lib/change-notes/2025-11-19-models.md new file mode 100644 index 000000000000..6ace9f08c642 --- /dev/null +++ b/rust/ql/lib/change-notes/2025-11-19-models.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Created more robust models for various kinds of type conversions. 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 46eea8f9c4ef..4dea8978f780 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml @@ -9,11 +9,21 @@ extensions: - ["<_ as core::ops::arith::Add>::add", "Argument[0].Reference", "ReturnValue", "taint", "manual"] # Clone - ["<_ as core::clone::Clone>::clone", "Argument[self].Reference", "ReturnValue", "value", "manual"] + - ["<_ as core::clone::Clone>::clone_from", "Argument[0].Reference", "Argument[self].Reference", "value", "manual"] # Conversions - - ["<_ as core::convert::Into>::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"] - - ["<_ as core::convert::Into>::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"] - # From - ["<_ as core::convert::From>::from", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["<_ as core::convert::From>::from", "Argument[0].Element", "ReturnValue.Element", "taint", "manual"] + - ["<_ as core::convert::Into>::into", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["<_ as core::convert::Into>::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"] + - ["<_ as core::convert::TryFrom>::try_from", "Argument[0]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as core::convert::TryFrom>::try_from", "Argument[0].Element", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "taint", "manual"] + - ["<_ as core::convert::TryInto>::try_into", "Argument[self]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["<_ as core::convert::TryInto>::try_into", "Argument[self].Element", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "taint", "manual"] + - ["<_ as core::convert::AsMut>::as_mut", "Argument[self]", "ReturnValue", "value", "manual"] + - ["<_ as core::convert::AsRef>::as_ref", "Argument[self]", "ReturnValue", "value", "manual"] + - ["core::char::from_digit", "Argument[0]", "ReturnValue.Field[core::option::Option::Some(0)]", "taint", "manual"] + - ["core::char::from_u32", "Argument[0]", "ReturnValue.Field[core::option::Option::Some(0)]", "taint", "manual"] + - ["core::char::from_u32_unchecked", "Argument[0]", "ReturnValue", "taint", "manual"] # Iterator - ["::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - ["<_ as value_trait::array::Array>::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 36a1c74018ed..f1ef89edcb5a 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -934,9 +934,36 @@ localStep | main.rs:575:10:575:10 | [post] receiver for b | main.rs:575:10:575:10 | [post] b | | main.rs:575:10:575:10 | b | main.rs:575:10:575:10 | receiver for b | | main.rs:575:10:575:10 | b | main.rs:576:20:576:20 | b | -| main.rs:604:13:604:33 | result_questionmark(...) | main.rs:604:9:604:9 | _ | -| main.rs:616:36:616:39 | ...::new(...) | main.rs:616:36:616:41 | MacroExpr | -| main.rs:616:36:616:41 | [post] MacroExpr | main.rs:616:36:616:39 | [post] ...::new(...) | +| main.rs:578:9:578:9 | [SSA] c | main.rs:579:10:579:10 | c | +| main.rs:578:9:578:9 | c | main.rs:578:9:578:9 | [SSA] c | +| main.rs:578:9:578:9 | c | main.rs:578:9:578:9 | c | +| main.rs:578:19:578:56 | ...::from_u32(...) | main.rs:578:19:578:56 | receiver for ...::from_u32(...) | +| main.rs:578:19:578:56 | [post] receiver for ...::from_u32(...) | main.rs:578:19:578:56 | [post] ...::from_u32(...) | +| main.rs:578:19:578:65 | ... .unwrap() | main.rs:578:9:578:9 | c | +| main.rs:583:9:583:9 | [SSA] a | main.rs:585:10:585:10 | a | +| main.rs:583:9:583:9 | a | main.rs:583:9:583:9 | [SSA] a | +| main.rs:583:9:583:9 | a | main.rs:583:9:583:9 | a | +| main.rs:583:13:583:22 | source(...) | main.rs:583:9:583:9 | a | +| main.rs:585:10:585:10 | [post] a | main.rs:589:19:589:19 | a | +| main.rs:585:10:585:10 | [post] receiver for a | main.rs:585:10:585:10 | [post] a | +| main.rs:585:10:585:10 | a | main.rs:585:10:585:10 | receiver for a | +| main.rs:585:10:585:10 | a | main.rs:589:19:589:19 | a | +| main.rs:587:9:587:13 | mut b | main.rs:587:13:587:13 | b | +| main.rs:587:13:587:13 | [SSA] b | main.rs:588:10:588:10 | b | +| main.rs:587:13:587:13 | b | main.rs:587:13:587:13 | [SSA] b | +| main.rs:587:22:587:22 | 0 | main.rs:587:9:587:13 | mut b | +| main.rs:588:10:588:10 | [post] b | main.rs:589:5:589:5 | [SSA] b | +| main.rs:588:10:588:10 | [post] b | main.rs:589:5:589:5 | b | +| main.rs:588:10:588:10 | b | main.rs:589:5:589:5 | [SSA] b | +| main.rs:588:10:588:10 | b | main.rs:589:5:589:5 | b | +| main.rs:589:5:589:5 | [SSA] b | main.rs:590:10:590:10 | b | +| main.rs:589:5:589:5 | [post] b | main.rs:590:10:590:10 | b | +| main.rs:589:5:589:5 | [post] receiver for b | main.rs:589:5:589:5 | [post] b | +| main.rs:589:5:589:5 | b | main.rs:589:5:589:5 | receiver for b | +| main.rs:589:5:589:5 | b | main.rs:590:10:590:10 | b | +| main.rs:618:13:618:33 | result_questionmark(...) | main.rs:618:9:618:9 | _ | +| main.rs:630:36:630:39 | ...::new(...) | main.rs:630:36:630:41 | MacroExpr | +| main.rs:630:36:630:41 | [post] MacroExpr | main.rs:630:36:630:39 | [post] ...::new(...) | readStep | main.rs:50:9:50:15 | Some(...) | {EXTERNAL LOCATION} | Some | main.rs:50:14:50:14 | _ | | main.rs:116:11:116:11 | [post] receiver for i | file://:0:0:0:0 | &ref | main.rs:116:11:116:11 | [post] i | @@ -1063,6 +1090,8 @@ readStep | main.rs:548:19:548:35 | vs_mut.iter_mut() | file://:0:0:0:0 | element | main.rs:548:9:548:14 | &mut ... | | main.rs:562:11:562:15 | [post] receiver for c_ref | file://:0:0:0:0 | &ref | main.rs:562:11:562:15 | [post] c_ref | | main.rs:562:11:562:15 | c_ref | file://:0:0:0:0 | &ref | main.rs:562:10:562:15 | * ... | +| main.rs:585:10:585:10 | [post] receiver for a | file://:0:0:0:0 | &ref | main.rs:585:10:585:10 | [post] a | +| main.rs:589:5:589:5 | [post] receiver for b | file://:0:0:0:0 | &ref | main.rs:589:5:589:5 | [post] b | storeStep | main.rs:116:11:116:11 | i | file://:0:0:0:0 | &ref | main.rs:116:11:116:11 | receiver for i | | main.rs:123:14:123:22 | source(...) | file://:0:0:0:0 | tuple.0 | main.rs:123:13:123:26 | TupleExpr | @@ -1165,4 +1194,7 @@ storeStep | main.rs:557:18:557:18 | c | file://:0:0:0:0 | &ref | main.rs:557:17:557:18 | &c | | main.rs:560:15:560:15 | b | file://:0:0:0:0 | &ref | main.rs:560:14:560:15 | &b | | main.rs:562:11:562:15 | c_ref | file://:0:0:0:0 | &ref | main.rs:562:11:562:15 | receiver for c_ref | -| main.rs:583:27:583:27 | 0 | {EXTERNAL LOCATION} | Some | main.rs:583:22:583:28 | Some(...) | +| main.rs:585:10:585:10 | a | file://:0:0:0:0 | &ref | main.rs:585:10:585:10 | receiver for a | +| main.rs:589:5:589:5 | b | file://:0:0:0:0 | &ref | main.rs:589:5:589:5 | receiver for b | +| main.rs:589:19:589:19 | a | file://:0:0:0:0 | &ref | main.rs:589:18:589:19 | &a | +| main.rs:597:27:597:27 | 0 | {EXTERNAL LOCATION} | Some | main.rs:597:22:597:28 | Some(...) | diff --git a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected index 7b6fd011d031..c2011da88d45 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected @@ -1,14 +1,17 @@ models -| 1 | Summary: ::new; Argument[0]; ReturnValue.Reference; value | -| 2 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 3 | Summary: ::unwrap_or; Argument[0]; ReturnValue; value | -| 4 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 5 | Summary: ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | -| 6 | Summary: ::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 7 | Summary: ::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 8 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 9 | Summary: ::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value | -| 10 | Summary: ::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 1 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | +| 2 | Summary: <_ as core::clone::Clone>::clone_from; Argument[0].Reference; Argument[self].Reference; value | +| 3 | Summary: ::new; Argument[0]; ReturnValue.Reference; value | +| 4 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 5 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 6 | Summary: ::unwrap_or; Argument[0]; ReturnValue; value | +| 7 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 8 | Summary: ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | +| 9 | Summary: ::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 10 | Summary: ::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 11 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 12 | Summary: ::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value | +| 13 | Summary: ::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | edges | main.rs:23:9:23:9 | s | main.rs:24:10:24:10 | s | provenance | | | main.rs:23:9:23:9 | s | main.rs:26:12:26:12 | x | provenance | | @@ -36,7 +39,7 @@ edges | main.rs:82:5:82:5 | l | main.rs:83:10:83:10 | l | provenance | | | main.rs:115:9:115:9 | i [&ref] | main.rs:116:11:116:11 | i [&ref] | provenance | | | main.rs:115:13:115:31 | ...::new(...) [&ref] | main.rs:115:9:115:9 | i [&ref] | provenance | | -| main.rs:115:22:115:30 | source(...) | main.rs:115:13:115:31 | ...::new(...) [&ref] | provenance | MaD:1 | +| main.rs:115:22:115:30 | source(...) | main.rs:115:13:115:31 | ...::new(...) [&ref] | provenance | MaD:3 | | main.rs:116:11:116:11 | i [&ref] | main.rs:116:10:116:11 | * ... | provenance | | | main.rs:123:9:123:9 | a [tuple.0] | main.rs:124:10:124:10 | a [tuple.0] | provenance | | | main.rs:123:13:123:26 | TupleExpr [tuple.0] | main.rs:123:9:123:9 | a [tuple.0] | provenance | | @@ -117,32 +120,32 @@ edges | main.rs:267:12:267:18 | Some(...) [Some] | main.rs:267:17:267:17 | n | provenance | | | main.rs:267:17:267:17 | n | main.rs:269:18:269:18 | n | provenance | | | main.rs:267:17:267:17 | n | main.rs:273:14:273:14 | n | provenance | | -| main.rs:278:9:278:10 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:2 | +| main.rs:278:9:278:10 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:5 | | main.rs:278:14:278:29 | Some(...) [Some] | main.rs:278:9:278:10 | s1 [Some] | provenance | | | main.rs:278:19:278:28 | source(...) | main.rs:278:14:278:29 | Some(...) [Some] | provenance | | -| main.rs:283:9:283:10 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:4 | +| main.rs:283:9:283:10 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:7 | | main.rs:283:14:283:29 | Some(...) [Some] | main.rs:283:9:283:10 | s1 [Some] | provenance | | | main.rs:283:19:283:28 | source(...) | main.rs:283:14:283:29 | Some(...) [Some] | provenance | | -| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:3 | -| main.rs:291:9:291:10 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:6 | +| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:6 | +| main.rs:291:9:291:10 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:9 | | main.rs:291:14:291:29 | Some(...) [Some] | main.rs:291:9:291:10 | s1 [Some] | provenance | | | main.rs:291:19:291:28 | source(...) | main.rs:291:14:291:29 | Some(...) [Some] | provenance | | -| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:5 | +| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:8 | | main.rs:299:9:299:10 | s1 [Some] | main.rs:301:14:301:15 | s1 [Some] | provenance | | | main.rs:299:14:299:29 | Some(...) [Some] | main.rs:299:9:299:10 | s1 [Some] | provenance | | | main.rs:299:19:299:28 | source(...) | main.rs:299:14:299:29 | Some(...) [Some] | provenance | | | main.rs:301:9:301:10 | i1 | main.rs:302:10:302:11 | i1 | provenance | | | main.rs:301:14:301:15 | s1 [Some] | main.rs:301:14:301:16 | TryExpr | provenance | | | main.rs:301:14:301:16 | TryExpr | main.rs:301:9:301:10 | i1 | provenance | | -| main.rs:308:9:308:10 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:10 | +| main.rs:308:9:308:10 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:13 | | main.rs:308:32:308:45 | Ok(...) [Ok] | main.rs:308:9:308:10 | r1 [Ok] | provenance | | | main.rs:308:35:308:44 | source(...) | main.rs:308:32:308:45 | Ok(...) [Ok] | provenance | | -| main.rs:309:9:309:11 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:2 | +| main.rs:309:9:309:11 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:5 | | main.rs:309:28:309:34 | r1.ok() [Some] | main.rs:309:9:309:11 | o1a [Some] | provenance | | -| main.rs:314:9:314:10 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:7 | +| main.rs:314:9:314:10 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:10 | | main.rs:314:32:314:46 | Err(...) [Err] | main.rs:314:9:314:10 | r2 [Err] | provenance | | | main.rs:314:36:314:45 | source(...) | main.rs:314:32:314:46 | Err(...) [Err] | provenance | | -| main.rs:316:9:316:11 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:2 | +| main.rs:316:9:316:11 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:5 | | main.rs:316:28:316:35 | r2.err() [Some] | main.rs:316:9:316:11 | o2b [Some] | provenance | | | main.rs:322:9:322:10 | s1 [Ok] | main.rs:325:14:325:15 | s1 [Ok] | provenance | | | main.rs:322:32:322:45 | Ok(...) [Ok] | main.rs:322:9:322:10 | s1 [Ok] | provenance | | @@ -150,10 +153,10 @@ edges | main.rs:325:9:325:10 | i1 | main.rs:327:10:327:11 | i1 | provenance | | | main.rs:325:14:325:15 | s1 [Ok] | main.rs:325:14:325:16 | TryExpr | provenance | | | main.rs:325:14:325:16 | TryExpr | main.rs:325:9:325:10 | i1 | provenance | | -| main.rs:335:9:335:10 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:8 | +| main.rs:335:9:335:10 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:11 | | main.rs:335:32:335:45 | Ok(...) [Ok] | main.rs:335:9:335:10 | s1 [Ok] | provenance | | | main.rs:335:35:335:44 | source(...) | main.rs:335:32:335:45 | Ok(...) [Ok] | provenance | | -| main.rs:339:9:339:10 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:9 | +| main.rs:339:9:339:10 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:12 | | main.rs:339:32:339:46 | Err(...) [Err] | main.rs:339:9:339:10 | s2 [Err] | provenance | | | main.rs:339:36:339:45 | source(...) | main.rs:339:32:339:46 | Err(...) [Err] | provenance | | | main.rs:350:9:350:10 | s1 [A] | main.rs:352:11:352:12 | s1 [A] | provenance | | @@ -257,6 +260,14 @@ edges | main.rs:557:17:557:18 | &c [&ref] | main.rs:557:9:557:13 | c_ref [&ref] | provenance | | | main.rs:557:18:557:18 | c | main.rs:557:17:557:18 | &c [&ref] | provenance | | | main.rs:562:11:562:15 | c_ref [&ref] | main.rs:562:10:562:15 | * ... | provenance | | +| main.rs:583:9:583:9 | a | main.rs:585:10:585:10 | a | provenance | | +| main.rs:583:9:583:9 | a | main.rs:589:19:589:19 | a | provenance | | +| main.rs:583:13:583:22 | source(...) | main.rs:583:9:583:9 | a | provenance | | +| main.rs:585:10:585:10 | a | main.rs:585:10:585:18 | a.clone() | provenance | MaD:1 | +| main.rs:585:10:585:10 | a | main.rs:585:10:585:18 | a.clone() | provenance | MaD:4 | +| main.rs:589:5:589:5 | [post] b | main.rs:590:10:590:10 | b | provenance | | +| main.rs:589:18:589:19 | &a [&ref] | main.rs:589:5:589:5 | [post] b | provenance | MaD:2 | +| main.rs:589:19:589:19 | a | main.rs:589:18:589:19 | &a [&ref] | provenance | | nodes | main.rs:19:10:19:18 | source(...) | semmle.label | source(...) | | main.rs:23:9:23:9 | s | semmle.label | s | @@ -554,6 +565,14 @@ nodes | main.rs:559:10:559:10 | a | semmle.label | a | | main.rs:562:10:562:15 | * ... | semmle.label | * ... | | main.rs:562:11:562:15 | c_ref [&ref] | semmle.label | c_ref [&ref] | +| main.rs:583:9:583:9 | a | semmle.label | a | +| main.rs:583:13:583:22 | source(...) | semmle.label | source(...) | +| main.rs:585:10:585:10 | a | semmle.label | a | +| main.rs:585:10:585:18 | a.clone() | semmle.label | a.clone() | +| main.rs:589:5:589:5 | [post] b | semmle.label | [post] b | +| main.rs:589:18:589:19 | &a [&ref] | semmle.label | &a [&ref] | +| main.rs:589:19:589:19 | a | semmle.label | a | +| main.rs:590:10:590:10 | b | semmle.label | b | subpaths testFailures #select @@ -620,3 +639,5 @@ testFailures | main.rs:544:10:544:18 | vs_mut[0] | main.rs:542:23:542:32 | source(...) | main.rs:544:10:544:18 | vs_mut[0] | $@ | main.rs:542:23:542:32 | source(...) | source(...) | | main.rs:559:10:559:10 | a | main.rs:554:13:554:22 | source(...) | main.rs:559:10:559:10 | a | $@ | main.rs:554:13:554:22 | source(...) | source(...) | | main.rs:562:10:562:15 | * ... | main.rs:556:13:556:22 | source(...) | main.rs:562:10:562:15 | * ... | $@ | main.rs:556:13:556:22 | source(...) | source(...) | +| main.rs:585:10:585:18 | a.clone() | main.rs:583:13:583:22 | source(...) | main.rs:585:10:585:18 | a.clone() | $@ | main.rs:583:13:583:22 | source(...) | source(...) | +| main.rs:590:10:590:10 | b | main.rs:583:13:583:22 | source(...) | main.rs:590:10:590:10 | b | $@ | main.rs:583:13:583:22 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/local/main.rs b/rust/ql/test/library-tests/dataflow/local/main.rs index b3c40bd45130..cd67b7f5fc76 100644 --- a/rust/ql/test/library-tests/dataflow/local/main.rs +++ b/rust/ql/test/library-tests/dataflow/local/main.rs @@ -574,6 +574,20 @@ fn conversions() { sink(b as i64); // $ hasTaintFlow=51 sink(b.into()); // $ MISSING: hasTaintFlow=51 sink(i64::from(b)); // $ hasTaintFlow=51 + + let c: char = std::char::from_u32(source(52) as u32).unwrap(); + sink(c as i64); // $ hasTaintFlow=52 +} + +fn clone() { + let a = source(60); + + sink(a.clone()); // $ hasValueFlow=60 + + let mut b: i64 = 0; + sink(b); + b.clone_from(&a); + sink(b); // $ hasValueFlow=60 } fn main() { @@ -619,4 +633,5 @@ fn main() { iterators(); references(); conversions(); + clone(); } diff --git a/rust/ql/test/library-tests/dataflow/strings/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/strings/CONSISTENCY/PathResolutionConsistency.expected index ccda75006f94..3141d67ef4a5 100644 --- a/rust/ql/test/library-tests/dataflow/strings/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/strings/CONSISTENCY/PathResolutionConsistency.expected @@ -1,2 +1,4 @@ multipleCallTargets -| main.rs:52:14:52:29 | ...::from(...) | +| main.rs:57:14:57:29 | ...::from(...) | +| main.rs:69:14:69:32 | ...::from(...) | +| main.rs:127:14:127:24 | s1.as_ref() | diff --git a/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected b/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected index 6cb680fa6ca9..7b35771aed86 100644 --- a/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected @@ -1,141 +1,206 @@ models | 1 | Summary: <_ as alloc::string::ToString>::to_string; Argument[self]; ReturnValue; taint | -| 2 | Summary: <_ as core::convert::From>::from; Argument[0]; ReturnValue; taint | -| 3 | Summary: <_ as core::ops::arith::Add>::add; Argument[0].Reference; ReturnValue; taint | -| 4 | Summary: <_ as core::ops::arith::Add>::add; Argument[self]; ReturnValue; taint | -| 5 | Summary: ::from; Argument[0].Reference; ReturnValue; value | -| 6 | Summary: ::add; Argument[self]; ReturnValue; value | -| 7 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 8 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 9 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 2 | Summary: <_ as core::convert::AsMut>::as_mut; Argument[self]; ReturnValue; value | +| 3 | Summary: <_ as core::convert::AsRef>::as_ref; Argument[self]; ReturnValue; value | +| 4 | Summary: <_ as core::convert::From>::from; Argument[0].Element; ReturnValue.Element; taint | +| 5 | Summary: <_ as core::convert::From>::from; Argument[0]; ReturnValue; taint | +| 6 | Summary: <_ as core::ops::arith::Add>::add; Argument[0].Reference; ReturnValue; taint | +| 7 | Summary: <_ as core::ops::arith::Add>::add; Argument[self]; ReturnValue; taint | +| 8 | Summary: ::as_mut; Argument[self]; ReturnValue; value | +| 9 | Summary: ::as_ref; Argument[self]; ReturnValue; value | +| 10 | Summary: ::from; Argument[0].Reference; ReturnValue; value | +| 11 | Summary: ::add; Argument[self]; ReturnValue; value | +| 12 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 13 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 14 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | edges -| main.rs:26:9:26:9 | s | main.rs:27:19:27:25 | s[...] | provenance | | -| main.rs:26:13:26:22 | source(...) | main.rs:26:9:26:9 | s | provenance | | -| main.rs:27:9:27:14 | sliced [&ref] | main.rs:28:16:28:21 | sliced | provenance | | -| main.rs:27:18:27:25 | &... [&ref] | main.rs:27:9:27:14 | sliced [&ref] | provenance | | -| main.rs:27:19:27:25 | s[...] | main.rs:27:18:27:25 | &... [&ref] | provenance | | -| main.rs:32:9:32:10 | s1 | main.rs:35:9:35:10 | s4 | provenance | | -| main.rs:32:9:32:10 | s1 | main.rs:35:14:35:15 | s1 | provenance | | -| main.rs:32:14:32:23 | source(...) | main.rs:32:9:32:10 | s1 | provenance | | -| main.rs:35:9:35:10 | s4 | main.rs:38:10:38:11 | s4 | provenance | | -| main.rs:35:14:35:15 | s1 | main.rs:35:14:35:20 | ... + ... | provenance | MaD:4 | -| main.rs:35:14:35:15 | s1 | main.rs:35:14:35:20 | ... + ... | provenance | MaD:6 | -| main.rs:35:14:35:20 | ... + ... | main.rs:35:9:35:10 | s4 | provenance | | -| main.rs:43:9:43:10 | s1 | main.rs:46:34:46:35 | s1 | provenance | | -| main.rs:43:14:43:23 | source(...) | main.rs:43:9:43:10 | s1 | provenance | | -| main.rs:46:33:46:35 | &s1 [&ref] | main.rs:46:10:46:35 | ... + ... | provenance | MaD:3 | -| main.rs:46:34:46:35 | s1 | main.rs:46:33:46:35 | &s1 [&ref] | provenance | | -| main.rs:51:9:51:10 | s1 | main.rs:52:27:52:28 | s1 | provenance | | -| main.rs:51:14:51:29 | source_slice(...) | main.rs:51:9:51:10 | s1 | provenance | | -| main.rs:52:9:52:10 | s2 | main.rs:53:10:53:11 | s2 | provenance | | -| main.rs:52:14:52:29 | ...::from(...) | main.rs:52:9:52:10 | s2 | provenance | | -| main.rs:52:27:52:28 | s1 | main.rs:52:14:52:29 | ...::from(...) | provenance | MaD:2 | -| main.rs:52:27:52:28 | s1 | main.rs:52:14:52:29 | ...::from(...) | provenance | MaD:5 | -| main.rs:57:9:57:10 | s1 | main.rs:58:14:58:27 | s1.to_string() | provenance | MaD:1 | -| main.rs:57:14:57:29 | source_slice(...) | main.rs:57:9:57:10 | s1 | provenance | | -| main.rs:58:9:58:10 | s2 | main.rs:59:10:59:11 | s2 | provenance | | -| main.rs:58:14:58:27 | s1.to_string() | main.rs:58:9:58:10 | s2 | provenance | | -| main.rs:63:9:63:9 | s | main.rs:64:16:64:16 | s | provenance | | -| main.rs:63:9:63:9 | s | main.rs:64:16:64:25 | s.as_str() | provenance | MaD:7 | -| main.rs:63:13:63:22 | source(...) | main.rs:63:9:63:9 | s | provenance | | -| main.rs:64:16:64:16 | s | main.rs:64:16:64:25 | s.as_str() | provenance | MaD:7 | -| main.rs:68:9:68:9 | s | main.rs:70:34:70:61 | MacroExpr | provenance | | -| main.rs:68:9:68:9 | s | main.rs:73:34:73:59 | MacroExpr | provenance | | -| main.rs:68:13:68:22 | source(...) | main.rs:68:9:68:9 | s | provenance | | -| main.rs:70:9:70:18 | formatted1 | main.rs:71:10:71:19 | formatted1 | provenance | | -| main.rs:70:22:70:62 | ...::format(...) | main.rs:70:9:70:18 | formatted1 | provenance | | -| main.rs:70:34:70:61 | MacroExpr | main.rs:70:22:70:62 | ...::format(...) | provenance | MaD:8 | -| main.rs:73:9:73:18 | formatted2 | main.rs:74:10:74:19 | formatted2 | provenance | | -| main.rs:73:22:73:60 | ...::format(...) | main.rs:73:9:73:18 | formatted2 | provenance | | -| main.rs:73:34:73:59 | MacroExpr | main.rs:73:22:73:60 | ...::format(...) | provenance | MaD:8 | -| main.rs:76:9:76:13 | width | main.rs:77:34:77:74 | MacroExpr | provenance | | -| main.rs:76:17:76:32 | source_usize(...) | main.rs:76:9:76:13 | width | provenance | | -| main.rs:77:9:77:18 | formatted3 | main.rs:78:10:78:19 | formatted3 | provenance | | -| main.rs:77:22:77:75 | ...::format(...) | main.rs:77:9:77:18 | formatted3 | provenance | | -| main.rs:77:34:77:74 | MacroExpr | main.rs:77:22:77:75 | ...::format(...) | provenance | MaD:8 | -| main.rs:82:9:82:10 | s1 | main.rs:86:18:86:25 | MacroExpr | provenance | | -| main.rs:82:9:82:10 | s1 | main.rs:87:18:87:32 | MacroExpr | provenance | | -| main.rs:82:14:82:23 | source(...) | main.rs:82:9:82:10 | s1 | provenance | | -| main.rs:86:18:86:25 | ...::format(...) | main.rs:86:18:86:25 | { ... } | provenance | | -| main.rs:86:18:86:25 | ...::must_use(...) | main.rs:86:10:86:26 | MacroExpr | provenance | | -| main.rs:86:18:86:25 | MacroExpr | main.rs:86:18:86:25 | ...::format(...) | provenance | MaD:8 | -| main.rs:86:18:86:25 | { ... } | main.rs:86:18:86:25 | ...::must_use(...) | provenance | MaD:9 | -| main.rs:87:18:87:32 | ...::format(...) | main.rs:87:18:87:32 | { ... } | provenance | | -| main.rs:87:18:87:32 | ...::must_use(...) | main.rs:87:10:87:33 | MacroExpr | provenance | | -| main.rs:87:18:87:32 | MacroExpr | main.rs:87:18:87:32 | ...::format(...) | provenance | MaD:8 | -| main.rs:87:18:87:32 | { ... } | main.rs:87:18:87:32 | ...::must_use(...) | provenance | MaD:9 | +| main.rs:30:9:30:9 | s | main.rs:31:19:31:25 | s[...] | provenance | | +| main.rs:30:13:30:22 | source(...) | main.rs:30:9:30:9 | s | provenance | | +| main.rs:31:9:31:14 | sliced [&ref] | main.rs:32:16:32:21 | sliced | provenance | | +| main.rs:31:18:31:25 | &... [&ref] | main.rs:31:9:31:14 | sliced [&ref] | provenance | | +| main.rs:31:19:31:25 | s[...] | main.rs:31:18:31:25 | &... [&ref] | provenance | | +| main.rs:36:9:36:10 | s1 | main.rs:39:9:39:10 | s4 | provenance | | +| main.rs:36:9:36:10 | s1 | main.rs:39:14:39:15 | s1 | provenance | | +| main.rs:36:14:36:23 | source(...) | main.rs:36:9:36:10 | s1 | provenance | | +| main.rs:39:9:39:10 | s4 | main.rs:42:10:42:11 | s4 | provenance | | +| main.rs:39:14:39:15 | s1 | main.rs:39:14:39:20 | ... + ... | provenance | MaD:7 | +| main.rs:39:14:39:15 | s1 | main.rs:39:14:39:20 | ... + ... | provenance | MaD:11 | +| main.rs:39:14:39:20 | ... + ... | main.rs:39:9:39:10 | s4 | provenance | | +| main.rs:47:9:47:10 | s1 | main.rs:50:34:50:35 | s1 | provenance | | +| main.rs:47:14:47:23 | source(...) | main.rs:47:9:47:10 | s1 | provenance | | +| main.rs:50:33:50:35 | &s1 [&ref] | main.rs:50:10:50:35 | ... + ... | provenance | MaD:6 | +| main.rs:50:34:50:35 | s1 | main.rs:50:33:50:35 | &s1 [&ref] | provenance | | +| main.rs:55:9:55:10 | s1 | main.rs:57:27:57:28 | s1 | provenance | | +| main.rs:55:14:55:29 | source_slice(...) | main.rs:55:9:55:10 | s1 | provenance | | +| main.rs:57:9:57:10 | s2 | main.rs:58:10:58:11 | s2 | provenance | | +| main.rs:57:14:57:29 | ...::from(...) | main.rs:57:9:57:10 | s2 | provenance | | +| main.rs:57:27:57:28 | s1 | main.rs:57:14:57:29 | ...::from(...) | provenance | MaD:5 | +| main.rs:57:27:57:28 | s1 | main.rs:57:14:57:29 | ...::from(...) | provenance | MaD:10 | +| main.rs:66:9:66:10 | ss [element] | main.rs:67:16:67:17 | ss [element] | provenance | | +| main.rs:66:9:66:10 | ss [element] | main.rs:69:27:69:28 | ss [element] | provenance | | +| main.rs:66:9:66:10 | ss [element] | main.rs:78:36:78:37 | ss [element] | provenance | | +| main.rs:66:25:66:60 | [...] [element] | main.rs:66:9:66:10 | ss [element] | provenance | | +| main.rs:66:26:66:41 | source_slice(...) | main.rs:66:25:66:60 | [...] [element] | provenance | | +| main.rs:66:44:66:59 | source_slice(...) | main.rs:66:25:66:60 | [...] [element] | provenance | | +| main.rs:67:16:67:17 | ss [element] | main.rs:67:16:67:20 | ss[0] | provenance | | +| main.rs:69:9:69:10 | s5 | main.rs:70:10:70:11 | s5 | provenance | | +| main.rs:69:14:69:32 | ...::from(...) | main.rs:69:9:69:10 | s5 | provenance | | +| main.rs:69:27:69:28 | ss [element] | main.rs:69:27:69:31 | ss[0] | provenance | | +| main.rs:69:27:69:31 | ss[0] | main.rs:69:14:69:32 | ...::from(...) | provenance | MaD:5 | +| main.rs:69:27:69:31 | ss[0] | main.rs:69:14:69:32 | ...::from(...) | provenance | MaD:10 | +| main.rs:78:9:78:11 | ss2 [element] | main.rs:79:16:79:18 | ss2 [element] | provenance | | +| main.rs:78:26:78:38 | ...::from(...) [element] | main.rs:78:9:78:11 | ss2 [element] | provenance | | +| main.rs:78:36:78:37 | ss [element] | main.rs:78:26:78:38 | ...::from(...) [element] | provenance | MaD:4 | +| main.rs:79:16:79:18 | ss2 [element] | main.rs:79:16:79:21 | ss2[0] | provenance | | +| main.rs:89:9:89:10 | s1 | main.rs:90:14:90:27 | s1.to_string() | provenance | MaD:1 | +| main.rs:89:14:89:29 | source_slice(...) | main.rs:89:9:89:10 | s1 | provenance | | +| main.rs:90:9:90:10 | s2 | main.rs:91:10:91:11 | s2 | provenance | | +| main.rs:90:14:90:27 | s1.to_string() | main.rs:90:9:90:10 | s2 | provenance | | +| main.rs:95:9:95:9 | s | main.rs:96:16:96:16 | s | provenance | | +| main.rs:95:9:95:9 | s | main.rs:96:16:96:25 | s.as_str() | provenance | MaD:12 | +| main.rs:95:13:95:22 | source(...) | main.rs:95:9:95:9 | s | provenance | | +| main.rs:96:16:96:16 | s | main.rs:96:16:96:25 | s.as_str() | provenance | MaD:12 | +| main.rs:100:9:100:9 | s | main.rs:102:34:102:61 | MacroExpr | provenance | | +| main.rs:100:9:100:9 | s | main.rs:105:34:105:59 | MacroExpr | provenance | | +| main.rs:100:13:100:22 | source(...) | main.rs:100:9:100:9 | s | provenance | | +| main.rs:102:9:102:18 | formatted1 | main.rs:103:10:103:19 | formatted1 | provenance | | +| main.rs:102:22:102:62 | ...::format(...) | main.rs:102:9:102:18 | formatted1 | provenance | | +| main.rs:102:34:102:61 | MacroExpr | main.rs:102:22:102:62 | ...::format(...) | provenance | MaD:13 | +| main.rs:105:9:105:18 | formatted2 | main.rs:106:10:106:19 | formatted2 | provenance | | +| main.rs:105:22:105:60 | ...::format(...) | main.rs:105:9:105:18 | formatted2 | provenance | | +| main.rs:105:34:105:59 | MacroExpr | main.rs:105:22:105:60 | ...::format(...) | provenance | MaD:13 | +| main.rs:108:9:108:13 | width | main.rs:109:34:109:74 | MacroExpr | provenance | | +| main.rs:108:17:108:32 | source_usize(...) | main.rs:108:9:108:13 | width | provenance | | +| main.rs:109:9:109:18 | formatted3 | main.rs:110:10:110:19 | formatted3 | provenance | | +| main.rs:109:22:109:75 | ...::format(...) | main.rs:109:9:109:18 | formatted3 | provenance | | +| main.rs:109:34:109:74 | MacroExpr | main.rs:109:22:109:75 | ...::format(...) | provenance | MaD:13 | +| main.rs:114:9:114:10 | s1 | main.rs:118:18:118:25 | MacroExpr | provenance | | +| main.rs:114:9:114:10 | s1 | main.rs:119:18:119:32 | MacroExpr | provenance | | +| main.rs:114:14:114:23 | source(...) | main.rs:114:9:114:10 | s1 | provenance | | +| main.rs:118:18:118:25 | ...::format(...) | main.rs:118:18:118:25 | { ... } | provenance | | +| main.rs:118:18:118:25 | ...::must_use(...) | main.rs:118:10:118:26 | MacroExpr | provenance | | +| main.rs:118:18:118:25 | MacroExpr | main.rs:118:18:118:25 | ...::format(...) | provenance | MaD:13 | +| main.rs:118:18:118:25 | { ... } | main.rs:118:18:118:25 | ...::must_use(...) | provenance | MaD:14 | +| main.rs:119:18:119:32 | ...::format(...) | main.rs:119:18:119:32 | { ... } | provenance | | +| main.rs:119:18:119:32 | ...::must_use(...) | main.rs:119:10:119:33 | MacroExpr | provenance | | +| main.rs:119:18:119:32 | MacroExpr | main.rs:119:18:119:32 | ...::format(...) | provenance | MaD:13 | +| main.rs:119:18:119:32 | { ... } | main.rs:119:18:119:32 | ...::must_use(...) | provenance | MaD:14 | +| main.rs:124:9:124:14 | mut s1 | main.rs:126:15:126:16 | s1 | provenance | | +| main.rs:124:9:124:14 | mut s1 | main.rs:127:14:127:24 | s1.as_ref() | provenance | MaD:3 | +| main.rs:124:9:124:14 | mut s1 | main.rs:127:14:127:24 | s1.as_ref() | provenance | MaD:9 | +| main.rs:124:9:124:14 | mut s1 | main.rs:128:14:128:15 | s1 | provenance | | +| main.rs:124:9:124:14 | mut s1 | main.rs:128:14:128:24 | s1.as_mut() | provenance | MaD:2 | +| main.rs:124:9:124:14 | mut s1 | main.rs:128:14:128:24 | s1.as_mut() | provenance | MaD:8 | +| main.rs:124:18:124:27 | source(...) | main.rs:124:18:124:39 | ... .to_string() | provenance | MaD:1 | +| main.rs:124:18:124:39 | ... .to_string() | main.rs:124:9:124:14 | mut s1 | provenance | | +| main.rs:126:15:126:16 | s1 | main.rs:126:14:126:16 | &s1 | provenance | | +| main.rs:128:14:128:15 | s1 | main.rs:128:14:128:24 | s1.as_mut() | provenance | MaD:2 | +| main.rs:128:14:128:15 | s1 | main.rs:128:14:128:24 | s1.as_mut() | provenance | MaD:8 | nodes -| main.rs:26:9:26:9 | s | semmle.label | s | -| main.rs:26:13:26:22 | source(...) | semmle.label | source(...) | -| main.rs:27:9:27:14 | sliced [&ref] | semmle.label | sliced [&ref] | -| main.rs:27:18:27:25 | &... [&ref] | semmle.label | &... [&ref] | -| main.rs:27:19:27:25 | s[...] | semmle.label | s[...] | -| main.rs:28:16:28:21 | sliced | semmle.label | sliced | -| main.rs:32:9:32:10 | s1 | semmle.label | s1 | -| main.rs:32:14:32:23 | source(...) | semmle.label | source(...) | -| main.rs:35:9:35:10 | s4 | semmle.label | s4 | -| main.rs:35:14:35:15 | s1 | semmle.label | s1 | -| main.rs:35:14:35:20 | ... + ... | semmle.label | ... + ... | -| main.rs:38:10:38:11 | s4 | semmle.label | s4 | -| main.rs:43:9:43:10 | s1 | semmle.label | s1 | -| main.rs:43:14:43:23 | source(...) | semmle.label | source(...) | -| main.rs:46:10:46:35 | ... + ... | semmle.label | ... + ... | -| main.rs:46:33:46:35 | &s1 [&ref] | semmle.label | &s1 [&ref] | -| main.rs:46:34:46:35 | s1 | semmle.label | s1 | -| main.rs:51:9:51:10 | s1 | semmle.label | s1 | -| main.rs:51:14:51:29 | source_slice(...) | semmle.label | source_slice(...) | -| main.rs:52:9:52:10 | s2 | semmle.label | s2 | -| main.rs:52:14:52:29 | ...::from(...) | semmle.label | ...::from(...) | -| main.rs:52:27:52:28 | s1 | semmle.label | s1 | -| main.rs:53:10:53:11 | s2 | semmle.label | s2 | -| main.rs:57:9:57:10 | s1 | semmle.label | s1 | -| main.rs:57:14:57:29 | source_slice(...) | semmle.label | source_slice(...) | -| main.rs:58:9:58:10 | s2 | semmle.label | s2 | -| main.rs:58:14:58:27 | s1.to_string() | semmle.label | s1.to_string() | -| main.rs:59:10:59:11 | s2 | semmle.label | s2 | -| main.rs:63:9:63:9 | s | semmle.label | s | -| main.rs:63:13:63:22 | source(...) | semmle.label | source(...) | -| main.rs:64:16:64:16 | s | semmle.label | s | -| main.rs:64:16:64:25 | s.as_str() | semmle.label | s.as_str() | -| main.rs:68:9:68:9 | s | semmle.label | s | -| main.rs:68:13:68:22 | source(...) | semmle.label | source(...) | -| main.rs:70:9:70:18 | formatted1 | semmle.label | formatted1 | -| main.rs:70:22:70:62 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:70:34:70:61 | MacroExpr | semmle.label | MacroExpr | -| main.rs:71:10:71:19 | formatted1 | semmle.label | formatted1 | -| main.rs:73:9:73:18 | formatted2 | semmle.label | formatted2 | -| main.rs:73:22:73:60 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:73:34:73:59 | MacroExpr | semmle.label | MacroExpr | -| main.rs:74:10:74:19 | formatted2 | semmle.label | formatted2 | -| main.rs:76:9:76:13 | width | semmle.label | width | -| main.rs:76:17:76:32 | source_usize(...) | semmle.label | source_usize(...) | -| main.rs:77:9:77:18 | formatted3 | semmle.label | formatted3 | -| main.rs:77:22:77:75 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:77:34:77:74 | MacroExpr | semmle.label | MacroExpr | -| main.rs:78:10:78:19 | formatted3 | semmle.label | formatted3 | -| main.rs:82:9:82:10 | s1 | semmle.label | s1 | -| main.rs:82:14:82:23 | source(...) | semmle.label | source(...) | -| main.rs:86:10:86:26 | MacroExpr | semmle.label | MacroExpr | -| main.rs:86:18:86:25 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:86:18:86:25 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| main.rs:86:18:86:25 | MacroExpr | semmle.label | MacroExpr | -| main.rs:86:18:86:25 | { ... } | semmle.label | { ... } | -| main.rs:87:10:87:33 | MacroExpr | semmle.label | MacroExpr | -| main.rs:87:18:87:32 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:87:18:87:32 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| main.rs:87:18:87:32 | MacroExpr | semmle.label | MacroExpr | -| main.rs:87:18:87:32 | { ... } | semmle.label | { ... } | +| main.rs:30:9:30:9 | s | semmle.label | s | +| main.rs:30:13:30:22 | source(...) | semmle.label | source(...) | +| main.rs:31:9:31:14 | sliced [&ref] | semmle.label | sliced [&ref] | +| main.rs:31:18:31:25 | &... [&ref] | semmle.label | &... [&ref] | +| main.rs:31:19:31:25 | s[...] | semmle.label | s[...] | +| main.rs:32:16:32:21 | sliced | semmle.label | sliced | +| main.rs:36:9:36:10 | s1 | semmle.label | s1 | +| main.rs:36:14:36:23 | source(...) | semmle.label | source(...) | +| main.rs:39:9:39:10 | s4 | semmle.label | s4 | +| main.rs:39:14:39:15 | s1 | semmle.label | s1 | +| main.rs:39:14:39:20 | ... + ... | semmle.label | ... + ... | +| main.rs:42:10:42:11 | s4 | semmle.label | s4 | +| main.rs:47:9:47:10 | s1 | semmle.label | s1 | +| main.rs:47:14:47:23 | source(...) | semmle.label | source(...) | +| main.rs:50:10:50:35 | ... + ... | semmle.label | ... + ... | +| main.rs:50:33:50:35 | &s1 [&ref] | semmle.label | &s1 [&ref] | +| main.rs:50:34:50:35 | s1 | semmle.label | s1 | +| main.rs:55:9:55:10 | s1 | semmle.label | s1 | +| main.rs:55:14:55:29 | source_slice(...) | semmle.label | source_slice(...) | +| main.rs:57:9:57:10 | s2 | semmle.label | s2 | +| main.rs:57:14:57:29 | ...::from(...) | semmle.label | ...::from(...) | +| main.rs:57:27:57:28 | s1 | semmle.label | s1 | +| main.rs:58:10:58:11 | s2 | semmle.label | s2 | +| main.rs:66:9:66:10 | ss [element] | semmle.label | ss [element] | +| main.rs:66:25:66:60 | [...] [element] | semmle.label | [...] [element] | +| main.rs:66:26:66:41 | source_slice(...) | semmle.label | source_slice(...) | +| main.rs:66:44:66:59 | source_slice(...) | semmle.label | source_slice(...) | +| main.rs:67:16:67:17 | ss [element] | semmle.label | ss [element] | +| main.rs:67:16:67:20 | ss[0] | semmle.label | ss[0] | +| main.rs:69:9:69:10 | s5 | semmle.label | s5 | +| main.rs:69:14:69:32 | ...::from(...) | semmle.label | ...::from(...) | +| main.rs:69:27:69:28 | ss [element] | semmle.label | ss [element] | +| main.rs:69:27:69:31 | ss[0] | semmle.label | ss[0] | +| main.rs:70:10:70:11 | s5 | semmle.label | s5 | +| main.rs:78:9:78:11 | ss2 [element] | semmle.label | ss2 [element] | +| main.rs:78:26:78:38 | ...::from(...) [element] | semmle.label | ...::from(...) [element] | +| main.rs:78:36:78:37 | ss [element] | semmle.label | ss [element] | +| main.rs:79:16:79:18 | ss2 [element] | semmle.label | ss2 [element] | +| main.rs:79:16:79:21 | ss2[0] | semmle.label | ss2[0] | +| main.rs:89:9:89:10 | s1 | semmle.label | s1 | +| main.rs:89:14:89:29 | source_slice(...) | semmle.label | source_slice(...) | +| main.rs:90:9:90:10 | s2 | semmle.label | s2 | +| main.rs:90:14:90:27 | s1.to_string() | semmle.label | s1.to_string() | +| main.rs:91:10:91:11 | s2 | semmle.label | s2 | +| main.rs:95:9:95:9 | s | semmle.label | s | +| main.rs:95:13:95:22 | source(...) | semmle.label | source(...) | +| main.rs:96:16:96:16 | s | semmle.label | s | +| main.rs:96:16:96:25 | s.as_str() | semmle.label | s.as_str() | +| main.rs:100:9:100:9 | s | semmle.label | s | +| main.rs:100:13:100:22 | source(...) | semmle.label | source(...) | +| main.rs:102:9:102:18 | formatted1 | semmle.label | formatted1 | +| main.rs:102:22:102:62 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:102:34:102:61 | MacroExpr | semmle.label | MacroExpr | +| main.rs:103:10:103:19 | formatted1 | semmle.label | formatted1 | +| main.rs:105:9:105:18 | formatted2 | semmle.label | formatted2 | +| main.rs:105:22:105:60 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:105:34:105:59 | MacroExpr | semmle.label | MacroExpr | +| main.rs:106:10:106:19 | formatted2 | semmle.label | formatted2 | +| main.rs:108:9:108:13 | width | semmle.label | width | +| main.rs:108:17:108:32 | source_usize(...) | semmle.label | source_usize(...) | +| main.rs:109:9:109:18 | formatted3 | semmle.label | formatted3 | +| main.rs:109:22:109:75 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:109:34:109:74 | MacroExpr | semmle.label | MacroExpr | +| main.rs:110:10:110:19 | formatted3 | semmle.label | formatted3 | +| main.rs:114:9:114:10 | s1 | semmle.label | s1 | +| main.rs:114:14:114:23 | source(...) | semmle.label | source(...) | +| main.rs:118:10:118:26 | MacroExpr | semmle.label | MacroExpr | +| main.rs:118:18:118:25 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:118:18:118:25 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:118:18:118:25 | MacroExpr | semmle.label | MacroExpr | +| main.rs:118:18:118:25 | { ... } | semmle.label | { ... } | +| main.rs:119:10:119:33 | MacroExpr | semmle.label | MacroExpr | +| main.rs:119:18:119:32 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:119:18:119:32 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:119:18:119:32 | MacroExpr | semmle.label | MacroExpr | +| main.rs:119:18:119:32 | { ... } | semmle.label | { ... } | +| main.rs:124:9:124:14 | mut s1 | semmle.label | mut s1 | +| main.rs:124:18:124:27 | source(...) | semmle.label | source(...) | +| main.rs:124:18:124:39 | ... .to_string() | semmle.label | ... .to_string() | +| main.rs:126:14:126:16 | &s1 | semmle.label | &s1 | +| main.rs:126:15:126:16 | s1 | semmle.label | s1 | +| main.rs:127:14:127:24 | s1.as_ref() | semmle.label | s1.as_ref() | +| main.rs:128:14:128:15 | s1 | semmle.label | s1 | +| main.rs:128:14:128:24 | s1.as_mut() | semmle.label | s1.as_mut() | subpaths testFailures #select -| main.rs:28:16:28:21 | sliced | main.rs:26:13:26:22 | source(...) | main.rs:28:16:28:21 | sliced | $@ | main.rs:26:13:26:22 | source(...) | source(...) | -| main.rs:38:10:38:11 | s4 | main.rs:32:14:32:23 | source(...) | main.rs:38:10:38:11 | s4 | $@ | main.rs:32:14:32:23 | source(...) | source(...) | -| main.rs:46:10:46:35 | ... + ... | main.rs:43:14:43:23 | source(...) | main.rs:46:10:46:35 | ... + ... | $@ | main.rs:43:14:43:23 | source(...) | source(...) | -| main.rs:53:10:53:11 | s2 | main.rs:51:14:51:29 | source_slice(...) | main.rs:53:10:53:11 | s2 | $@ | main.rs:51:14:51:29 | source_slice(...) | source_slice(...) | -| main.rs:59:10:59:11 | s2 | main.rs:57:14:57:29 | source_slice(...) | main.rs:59:10:59:11 | s2 | $@ | main.rs:57:14:57:29 | source_slice(...) | source_slice(...) | -| main.rs:64:16:64:25 | s.as_str() | main.rs:63:13:63:22 | source(...) | main.rs:64:16:64:25 | s.as_str() | $@ | main.rs:63:13:63:22 | source(...) | source(...) | -| main.rs:71:10:71:19 | formatted1 | main.rs:68:13:68:22 | source(...) | main.rs:71:10:71:19 | formatted1 | $@ | main.rs:68:13:68:22 | source(...) | source(...) | -| main.rs:74:10:74:19 | formatted2 | main.rs:68:13:68:22 | source(...) | main.rs:74:10:74:19 | formatted2 | $@ | main.rs:68:13:68:22 | source(...) | source(...) | -| main.rs:78:10:78:19 | formatted3 | main.rs:76:17:76:32 | source_usize(...) | main.rs:78:10:78:19 | formatted3 | $@ | main.rs:76:17:76:32 | source_usize(...) | source_usize(...) | -| main.rs:86:10:86:26 | MacroExpr | main.rs:82:14:82:23 | source(...) | main.rs:86:10:86:26 | MacroExpr | $@ | main.rs:82:14:82:23 | source(...) | source(...) | -| main.rs:87:10:87:33 | MacroExpr | main.rs:82:14:82:23 | source(...) | main.rs:87:10:87:33 | MacroExpr | $@ | main.rs:82:14:82:23 | source(...) | source(...) | +| main.rs:32:16:32:21 | sliced | main.rs:30:13:30:22 | source(...) | main.rs:32:16:32:21 | sliced | $@ | main.rs:30:13:30:22 | source(...) | source(...) | +| main.rs:42:10:42:11 | s4 | main.rs:36:14:36:23 | source(...) | main.rs:42:10:42:11 | s4 | $@ | main.rs:36:14:36:23 | source(...) | source(...) | +| main.rs:50:10:50:35 | ... + ... | main.rs:47:14:47:23 | source(...) | main.rs:50:10:50:35 | ... + ... | $@ | main.rs:47:14:47:23 | source(...) | source(...) | +| main.rs:58:10:58:11 | s2 | main.rs:55:14:55:29 | source_slice(...) | main.rs:58:10:58:11 | s2 | $@ | main.rs:55:14:55:29 | source_slice(...) | source_slice(...) | +| main.rs:67:16:67:20 | ss[0] | main.rs:66:26:66:41 | source_slice(...) | main.rs:67:16:67:20 | ss[0] | $@ | main.rs:66:26:66:41 | source_slice(...) | source_slice(...) | +| main.rs:67:16:67:20 | ss[0] | main.rs:66:44:66:59 | source_slice(...) | main.rs:67:16:67:20 | ss[0] | $@ | main.rs:66:44:66:59 | source_slice(...) | source_slice(...) | +| main.rs:70:10:70:11 | s5 | main.rs:66:26:66:41 | source_slice(...) | main.rs:70:10:70:11 | s5 | $@ | main.rs:66:26:66:41 | source_slice(...) | source_slice(...) | +| main.rs:70:10:70:11 | s5 | main.rs:66:44:66:59 | source_slice(...) | main.rs:70:10:70:11 | s5 | $@ | main.rs:66:44:66:59 | source_slice(...) | source_slice(...) | +| main.rs:79:16:79:21 | ss2[0] | main.rs:66:26:66:41 | source_slice(...) | main.rs:79:16:79:21 | ss2[0] | $@ | main.rs:66:26:66:41 | source_slice(...) | source_slice(...) | +| main.rs:79:16:79:21 | ss2[0] | main.rs:66:44:66:59 | source_slice(...) | main.rs:79:16:79:21 | ss2[0] | $@ | main.rs:66:44:66:59 | source_slice(...) | source_slice(...) | +| main.rs:91:10:91:11 | s2 | main.rs:89:14:89:29 | source_slice(...) | main.rs:91:10:91:11 | s2 | $@ | main.rs:89:14:89:29 | source_slice(...) | source_slice(...) | +| main.rs:96:16:96:25 | s.as_str() | main.rs:95:13:95:22 | source(...) | main.rs:96:16:96:25 | s.as_str() | $@ | main.rs:95:13:95:22 | source(...) | source(...) | +| main.rs:103:10:103:19 | formatted1 | main.rs:100:13:100:22 | source(...) | main.rs:103:10:103:19 | formatted1 | $@ | main.rs:100:13:100:22 | source(...) | source(...) | +| main.rs:106:10:106:19 | formatted2 | main.rs:100:13:100:22 | source(...) | main.rs:106:10:106:19 | formatted2 | $@ | main.rs:100:13:100:22 | source(...) | source(...) | +| main.rs:110:10:110:19 | formatted3 | main.rs:108:17:108:32 | source_usize(...) | main.rs:110:10:110:19 | formatted3 | $@ | main.rs:108:17:108:32 | source_usize(...) | source_usize(...) | +| main.rs:118:10:118:26 | MacroExpr | main.rs:114:14:114:23 | source(...) | main.rs:118:10:118:26 | MacroExpr | $@ | main.rs:114:14:114:23 | source(...) | source(...) | +| main.rs:119:10:119:33 | MacroExpr | main.rs:114:14:114:23 | source(...) | main.rs:119:10:119:33 | MacroExpr | $@ | main.rs:114:14:114:23 | source(...) | source(...) | +| main.rs:126:14:126:16 | &s1 | main.rs:124:18:124:27 | source(...) | main.rs:126:14:126:16 | &s1 | $@ | main.rs:124:18:124:27 | source(...) | source(...) | +| main.rs:127:14:127:24 | s1.as_ref() | main.rs:124:18:124:27 | source(...) | main.rs:127:14:127:24 | s1.as_ref() | $@ | main.rs:124:18:124:27 | source(...) | source(...) | +| main.rs:128:14:128:24 | s1.as_mut() | main.rs:124:18:124:27 | source(...) | main.rs:128:14:128:24 | s1.as_mut() | $@ | main.rs:124:18:124:27 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/strings/main.rs b/rust/ql/test/library-tests/dataflow/strings/main.rs index 633d9f42f463..7779ac75d50d 100644 --- a/rust/ql/test/library-tests/dataflow/strings/main.rs +++ b/rust/ql/test/library-tests/dataflow/strings/main.rs @@ -22,6 +22,10 @@ fn sink(s: String) { println!("{}", s); } +fn sink_ref(sr: &str) { + println!("{}", sr); +} + fn string_slice() { let s = source(35); let sliced = &s[1..2]; @@ -47,10 +51,38 @@ fn string_add_reference() { sink("Hello ".to_string() + &s2); } -fn string_from() { +fn string_conversions() { let s1 = source_slice(36); + let s2 = String::from(s1); sink(s2); // $ hasTaintFlow=36 + let s3 = String::try_from(s1).unwrap(); + sink(s3); // $ MISSING: hasTaintFlow=36 + let s4: String = s1.into(); + sink(s4); // $ MISSING: hasTaintFlow=36 + let s5: String = s1.try_into().unwrap(); + sink(s5); // $ MISSING: hasTaintFlow=36 + + let ss: [&str; 2] = [source_slice(37), source_slice(38)]; + sink_slice(ss[0]); // $ hasValueFlow=37 SPURIOUS: hasValueFlow=38 + + let s5 = String::from(ss[0]); + sink(s5); // $ hasTaintFlow=37 SPURIOUS: hasTaintFlow=38 + let s6 = String::try_from(ss[0]).unwrap(); + sink(s6); // $ MISSING: hasTaintFlow=37 + let s7: String = ss[0].into(); + sink(s7); // $ MISSING: hasTaintFlow=37 + let s8: String = ss[0].try_into().unwrap(); + sink(s8); // $ MISSING: hasTaintFlow=37 + + let ss2: Vec<&str> = Vec::from(ss); + sink_slice(ss2[0]); // $ hasTaintFlow=37 SPURIOUS: hasTaintFlow=38 + let ss3: Vec<&str> = Vec::try_from(ss).unwrap(); + sink_slice(ss3[0]); // $ MISSING: hasTaintFlow=37 + let ss4: Vec<&str> = ss.into(); + sink_slice(ss4[0]); // $ MISSING: hasTaintFlow=37 + let ss5: Vec<&str> = ss.try_into().unwrap(); + sink_slice(ss5[0]); // $ MISSING: hasTaintFlow=37 } fn string_to_string() { @@ -88,13 +120,22 @@ fn format_macro() { sink(format!("{s2} and {s3}")); } +fn refs() { + let mut s1 = source(90).to_string(); + + sink_ref(&s1); // $ hasTaintFlow=90 + sink_ref(s1.as_ref()); // $ hasTaintFlow=90 + sink_ref(s1.as_mut()); // $ hasTaintFlow=90 +} + fn main() { string_slice(); string_add(); string_add_reference(); - string_from(); + string_conversions(); as_str(); string_to_string(); format_args_built_in(); format_macro(); + refs(); } diff --git a/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected b/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected index a1f9b448ac75..1c13dae46990 100644 --- a/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected +++ b/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected @@ -17,32 +17,38 @@ edges | src/main.rs:7:11:7:19 | file_name | src/main.rs:9:35:9:43 | file_name | provenance | | | src/main.rs:9:9:9:17 | file_path | src/main.rs:11:24:11:32 | file_path | provenance | | +| src/main.rs:9:9:9:17 | file_path [element] | src/main.rs:11:24:11:32 | file_path [element] | provenance | | | src/main.rs:9:21:9:44 | ...::from(...) | src/main.rs:9:9:9:17 | file_path | provenance | | -| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:9 | -| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:14 | +| src/main.rs:9:21:9:44 | ...::from(...) [element] | src/main.rs:9:9:9:17 | file_path [element] | provenance | | +| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:12 | +| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:11 | +| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:17 | +| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) [element] | provenance | MaD:9 | +| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) [element] | provenance | MaD:10 | | src/main.rs:11:24:11:32 | file_path | src/main.rs:11:5:11:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | +| src/main.rs:11:24:11:32 | file_path [element] | src/main.rs:11:5:11:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:50:51:50:59 | file_path | src/main.rs:52:32:52:40 | file_path | provenance | | | src/main.rs:52:9:52:17 | file_path [&ref] | src/main.rs:53:21:53:44 | file_path.canonicalize() [Ok] | provenance | Config | | src/main.rs:52:21:52:41 | ...::new(...) [&ref] | src/main.rs:52:9:52:17 | file_path [&ref] | provenance | | -| src/main.rs:52:31:52:40 | &file_path [&ref] | src/main.rs:52:21:52:41 | ...::new(...) [&ref] | provenance | MaD:13 | +| src/main.rs:52:31:52:40 | &file_path [&ref] | src/main.rs:52:21:52:41 | ...::new(...) [&ref] | provenance | MaD:16 | | src/main.rs:52:32:52:40 | file_path | src/main.rs:52:31:52:40 | &file_path [&ref] | provenance | | | src/main.rs:53:9:53:17 | file_path | src/main.rs:58:24:58:32 | file_path | provenance | | -| src/main.rs:53:21:53:44 | file_path.canonicalize() [Ok] | src/main.rs:53:21:53:53 | ... .unwrap() | provenance | MaD:12 | +| src/main.rs:53:21:53:44 | file_path.canonicalize() [Ok] | src/main.rs:53:21:53:53 | ... .unwrap() | provenance | MaD:15 | | src/main.rs:53:21:53:53 | ... .unwrap() | src/main.rs:53:9:53:17 | file_path | provenance | | | src/main.rs:58:24:58:32 | file_path | src/main.rs:58:5:58:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:63:11:63:19 | file_path | src/main.rs:66:32:66:40 | file_path | provenance | | | src/main.rs:66:9:66:17 | file_path [&ref] | src/main.rs:71:24:71:32 | file_path [&ref] | provenance | | | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | src/main.rs:66:9:66:17 | file_path [&ref] | provenance | | -| src/main.rs:66:31:66:40 | &file_path [&ref] | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | provenance | MaD:13 | +| src/main.rs:66:31:66:40 | &file_path [&ref] | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | provenance | MaD:16 | | src/main.rs:66:32:66:40 | file_path | src/main.rs:66:31:66:40 | &file_path [&ref] | provenance | | | src/main.rs:71:24:71:32 | file_path [&ref] | src/main.rs:71:5:71:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:90:11:90:19 | file_path | src/main.rs:93:32:93:40 | file_path | provenance | | | src/main.rs:93:9:93:17 | file_path [&ref] | src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | provenance | Config | | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | src/main.rs:93:9:93:17 | file_path [&ref] | provenance | | -| src/main.rs:93:31:93:40 | &file_path [&ref] | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | provenance | MaD:13 | +| src/main.rs:93:31:93:40 | &file_path [&ref] | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | provenance | MaD:16 | | src/main.rs:93:32:93:40 | file_path | src/main.rs:93:31:93:40 | &file_path [&ref] | provenance | | | src/main.rs:98:9:98:17 | file_path | src/main.rs:99:24:99:32 | file_path | provenance | | -| src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | src/main.rs:98:21:98:53 | ... .unwrap() | provenance | MaD:12 | +| src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | src/main.rs:98:21:98:53 | ... .unwrap() | provenance | MaD:15 | | src/main.rs:98:21:98:53 | ... .unwrap() | src/main.rs:98:9:98:17 | file_path | provenance | | | src/main.rs:99:24:99:32 | file_path | src/main.rs:99:5:99:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:103:9:103:13 | path1 | src/main.rs:104:33:104:37 | path1 | provenance | | @@ -59,39 +65,39 @@ edges | src/main.rs:103:9:103:13 | path1 | src/main.rs:123:37:123:41 | path1 | provenance | | | src/main.rs:103:9:103:13 | path1 | src/main.rs:123:37:123:49 | path1.clone() | provenance | MaD:8 | | src/main.rs:103:17:103:30 | ...::args | src/main.rs:103:17:103:32 | ...::args(...) [element] | provenance | Src:MaD:7 | -| src/main.rs:103:17:103:32 | ...::args(...) [element] | src/main.rs:103:17:103:39 | ... .nth(...) [Some] | provenance | MaD:10 | -| src/main.rs:103:17:103:39 | ... .nth(...) [Some] | src/main.rs:103:17:103:48 | ... .unwrap() | provenance | MaD:11 | +| src/main.rs:103:17:103:32 | ...::args(...) [element] | src/main.rs:103:17:103:39 | ... .nth(...) [Some] | provenance | MaD:13 | +| src/main.rs:103:17:103:39 | ... .nth(...) [Some] | src/main.rs:103:17:103:48 | ... .unwrap() | provenance | MaD:14 | | src/main.rs:103:17:103:48 | ... .unwrap() | src/main.rs:103:9:103:13 | path1 | provenance | | | src/main.rs:104:33:104:37 | path1 | src/main.rs:104:33:104:45 | path1.clone() | provenance | MaD:8 | | src/main.rs:104:33:104:45 | path1.clone() | src/main.rs:104:13:104:31 | ...::open | provenance | MaD:2 Sink:MaD:2 | | src/main.rs:106:9:106:13 | path2 | src/main.rs:107:33:107:37 | path2 | provenance | | -| src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | src/main.rs:106:17:106:61 | ... .unwrap() | provenance | MaD:12 | +| src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | src/main.rs:106:17:106:61 | ... .unwrap() | provenance | MaD:15 | | src/main.rs:106:17:106:61 | ... .unwrap() | src/main.rs:106:9:106:13 | path2 | provenance | | | src/main.rs:106:39:106:43 | path1 | src/main.rs:106:39:106:51 | path1.clone() | provenance | MaD:8 | | src/main.rs:106:39:106:51 | path1.clone() | src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | provenance | Config | | src/main.rs:107:33:107:37 | path2 | src/main.rs:107:13:107:31 | ...::open | provenance | MaD:2 Sink:MaD:2 | | src/main.rs:109:9:109:13 | path3 | src/main.rs:110:35:110:39 | path3 | provenance | | | src/main.rs:109:17:109:54 | ...::canonicalize(...) [future, Ok] | src/main.rs:109:17:109:60 | await ... [Ok] | provenance | | -| src/main.rs:109:17:109:60 | await ... [Ok] | src/main.rs:109:17:109:69 | ... .unwrap() | provenance | MaD:12 | +| src/main.rs:109:17:109:60 | await ... [Ok] | src/main.rs:109:17:109:69 | ... .unwrap() | provenance | MaD:15 | | src/main.rs:109:17:109:69 | ... .unwrap() | src/main.rs:109:9:109:13 | path3 | provenance | | | src/main.rs:109:41:109:45 | path1 | src/main.rs:109:41:109:53 | path1.clone() | provenance | MaD:8 | | src/main.rs:109:41:109:53 | path1.clone() | src/main.rs:109:17:109:54 | ...::canonicalize(...) [future, Ok] | provenance | Config | | src/main.rs:110:35:110:39 | path3 | src/main.rs:110:13:110:33 | ...::open | provenance | MaD:4 Sink:MaD:4 | | src/main.rs:112:9:112:13 | path4 | src/main.rs:113:39:113:43 | path4 | provenance | | | src/main.rs:112:17:112:58 | ...::canonicalize(...) [future, Ok] | src/main.rs:112:17:112:64 | await ... [Ok] | provenance | | -| src/main.rs:112:17:112:64 | await ... [Ok] | src/main.rs:112:17:112:73 | ... .unwrap() | provenance | MaD:12 | +| src/main.rs:112:17:112:64 | await ... [Ok] | src/main.rs:112:17:112:73 | ... .unwrap() | provenance | MaD:15 | | src/main.rs:112:17:112:73 | ... .unwrap() | src/main.rs:112:9:112:13 | path4 | provenance | | | src/main.rs:112:45:112:49 | path1 | src/main.rs:112:45:112:57 | path1.clone() | provenance | MaD:8 | | src/main.rs:112:45:112:57 | path1.clone() | src/main.rs:112:17:112:58 | ...::canonicalize(...) [future, Ok] | provenance | Config | | src/main.rs:113:39:113:43 | path4 | src/main.rs:113:13:113:37 | ...::open | provenance | MaD:1 Sink:MaD:1 | | src/main.rs:115:9:115:13 | path5 [&ref] | src/main.rs:116:33:116:37 | path5 [&ref] | provenance | | | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | src/main.rs:115:9:115:13 | path5 [&ref] | provenance | | -| src/main.rs:115:38:115:43 | &path1 [&ref] | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | provenance | MaD:13 | +| src/main.rs:115:38:115:43 | &path1 [&ref] | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | provenance | MaD:16 | | src/main.rs:115:39:115:43 | path1 | src/main.rs:115:38:115:43 | &path1 [&ref] | provenance | | | src/main.rs:116:33:116:37 | path5 [&ref] | src/main.rs:116:13:116:31 | ...::open | provenance | MaD:2 Sink:MaD:2 | | src/main.rs:116:33:116:37 | path5 [&ref] | src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | provenance | Config | | src/main.rs:118:9:118:13 | path6 | src/main.rs:119:33:119:37 | path6 | provenance | | -| src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | src/main.rs:118:17:118:45 | ... .unwrap() | provenance | MaD:12 | +| src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | src/main.rs:118:17:118:45 | ... .unwrap() | provenance | MaD:15 | | src/main.rs:118:17:118:45 | ... .unwrap() | src/main.rs:118:9:118:13 | path6 | provenance | | | src/main.rs:119:33:119:37 | path6 | src/main.rs:119:13:119:31 | ...::open | provenance | MaD:2 Sink:MaD:2 | | src/main.rs:122:27:122:31 | path1 | src/main.rs:122:27:122:39 | path1.clone() | provenance | MaD:8 | @@ -102,15 +108,15 @@ edges | src/main.rs:170:16:170:29 | ...: ... [&ref] | src/main.rs:174:36:174:43 | path_str [&ref] | provenance | | | src/main.rs:172:9:172:12 | path [&ref] | src/main.rs:173:8:173:11 | path [&ref] | provenance | | | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | src/main.rs:172:9:172:12 | path [&ref] | provenance | | -| src/main.rs:172:26:172:33 | path_str [&ref] | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | provenance | MaD:13 | +| src/main.rs:172:26:172:33 | path_str [&ref] | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | provenance | MaD:16 | | src/main.rs:173:8:173:11 | path [&ref] | src/main.rs:173:13:173:18 | exists | provenance | MaD:3 Sink:MaD:3 | | src/main.rs:173:8:173:11 | path [&ref] | src/main.rs:177:36:177:39 | path [&ref] | provenance | | | src/main.rs:174:36:174:43 | path_str [&ref] | src/main.rs:174:25:174:34 | ...::open | provenance | MaD:2 Sink:MaD:2 | | src/main.rs:177:36:177:39 | path [&ref] | src/main.rs:177:25:177:34 | ...::open | provenance | MaD:2 Sink:MaD:2 | | src/main.rs:185:9:185:13 | path1 | src/main.rs:186:18:186:22 | path1 | provenance | | | src/main.rs:185:17:185:30 | ...::args | src/main.rs:185:17:185:32 | ...::args(...) [element] | provenance | Src:MaD:7 | -| src/main.rs:185:17:185:32 | ...::args(...) [element] | src/main.rs:185:17:185:39 | ... .nth(...) [Some] | provenance | MaD:10 | -| src/main.rs:185:17:185:39 | ... .nth(...) [Some] | src/main.rs:185:17:185:48 | ... .unwrap() | provenance | MaD:11 | +| src/main.rs:185:17:185:32 | ...::args(...) [element] | src/main.rs:185:17:185:39 | ... .nth(...) [Some] | provenance | MaD:13 | +| src/main.rs:185:17:185:39 | ... .nth(...) [Some] | src/main.rs:185:17:185:48 | ... .unwrap() | provenance | MaD:14 | | src/main.rs:185:17:185:48 | ... .unwrap() | src/main.rs:185:9:185:13 | path1 | provenance | | | src/main.rs:186:17:186:22 | &path1 [&ref] | src/main.rs:170:16:170:29 | ...: ... [&ref] | provenance | | | src/main.rs:186:18:186:22 | path1 | src/main.rs:186:17:186:22 | &path1 [&ref] | provenance | | @@ -123,19 +129,25 @@ models | 6 | Sink: std::fs::read_to_string; Argument[0]; path-injection | | 7 | Source: std::env::args; ReturnValue.Element; commandargs | | 8 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 9 | Summary: <_ as core::convert::From>::from; Argument[0]; ReturnValue; taint | -| 10 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 11 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 12 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 13 | Summary: ::new; Argument[0].Reference; ReturnValue.Reference; value | -| 14 | Summary: ::from; Argument[0]; ReturnValue; taint | +| 9 | Summary: <_ as core::convert::From>::from; Argument[0].Element; ReturnValue.Element; taint | +| 10 | Summary: <_ as core::convert::From>::from; Argument[0].Reference.Element; ReturnValue.Element; taint | +| 11 | Summary: <_ as core::convert::From>::from; Argument[0].Reference; ReturnValue; taint | +| 12 | Summary: <_ as core::convert::From>::from; Argument[0]; ReturnValue; taint | +| 13 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 14 | Summary: ::unwrap; 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: ::new; Argument[0].Reference; ReturnValue.Reference; value | +| 17 | Summary: ::from; Argument[0]; ReturnValue; taint | nodes | src/main.rs:7:11:7:19 | file_name | semmle.label | file_name | | src/main.rs:9:9:9:17 | file_path | semmle.label | file_path | +| src/main.rs:9:9:9:17 | file_path [element] | semmle.label | file_path [element] | | src/main.rs:9:21:9:44 | ...::from(...) | semmle.label | ...::from(...) | +| src/main.rs:9:21:9:44 | ...::from(...) [element] | semmle.label | ...::from(...) [element] | | src/main.rs:9:35:9:43 | file_name | semmle.label | file_name | | src/main.rs:11:5:11:22 | ...::read_to_string | semmle.label | ...::read_to_string | | src/main.rs:11:24:11:32 | file_path | semmle.label | file_path | +| src/main.rs:11:24:11:32 | file_path [element] | semmle.label | file_path [element] | | src/main.rs:50:51:50:59 | file_path | semmle.label | file_path | | src/main.rs:52:9:52:17 | file_path [&ref] | semmle.label | file_path [&ref] | | src/main.rs:52:21:52:41 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index e4657a426ea5..a262c1cbb85c 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -15,32 +15,32 @@ edges | test_cipher.rs:18:28:18:36 | &... [&ref] | test_cipher.rs:18:9:18:14 | const1 [&ref] | provenance | | | test_cipher.rs:18:29:18:36 | [0u8; 16] | test_cipher.rs:18:28:18:36 | &... [&ref] | provenance | | | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:3 Sink:MaD:3 | -| test_cipher.rs:19:73:19:78 | const1 [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | provenance | MaD:9 | +| test_cipher.rs:19:73:19:78 | const1 [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | provenance | MaD:12 | | test_cipher.rs:25:9:25:14 | const4 [&ref] | test_cipher.rs:26:66:26:71 | const4 [&ref] | provenance | | | test_cipher.rs:25:28:25:36 | &... [&ref] | test_cipher.rs:25:9:25:14 | const4 [&ref] | provenance | | | test_cipher.rs:25:29:25:36 | [0u8; 16] | test_cipher.rs:25:28:25:36 | &... [&ref] | provenance | | | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:4 Sink:MaD:4 | -| test_cipher.rs:26:66:26:71 | const4 [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | provenance | MaD:9 | +| test_cipher.rs:26:66:26:71 | const4 [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | provenance | MaD:12 | | test_cipher.rs:29:9:29:14 | const5 [&ref] | test_cipher.rs:30:95:30:100 | const5 [&ref] | provenance | | | test_cipher.rs:29:28:29:36 | &... [&ref] | test_cipher.rs:29:9:29:14 | const5 [&ref] | provenance | | | test_cipher.rs:29:29:29:36 | [0u8; 16] | test_cipher.rs:29:28:29:36 | &... [&ref] | provenance | | | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:5 Sink:MaD:5 | -| test_cipher.rs:30:95:30:100 | const5 [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | provenance | MaD:9 | +| test_cipher.rs:30:95:30:100 | const5 [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | provenance | MaD:12 | | test_cipher.rs:37:9:37:14 | const7 | test_cipher.rs:38:74:38:79 | const7 | provenance | | | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:9:37:14 | const7 | provenance | | | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:3 Sink:MaD:3 | -| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:9 | +| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:12 | | test_cipher.rs:38:74:38:79 | const7 | test_cipher.rs:38:73:38:79 | &const7 [&ref] | provenance | | | test_cipher.rs:41:9:41:14 | const8 [&ref] | test_cipher.rs:42:73:42:78 | const8 [&ref] | provenance | | | test_cipher.rs:41:28:41:76 | &... [&ref] | test_cipher.rs:41:9:41:14 | const8 [&ref] | provenance | | | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:28:41:76 | &... [&ref] | provenance | | | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:3 Sink:MaD:3 | -| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:9 | +| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:12 | | test_cipher.rs:50:9:50:15 | const10 [element] | test_cipher.rs:51:75:51:81 | const10 [element] | provenance | | | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | provenance | Src:MaD:7 | | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | | | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:3 Sink:MaD:3 Sink:MaD:3 | -| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:9 | +| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:12 | | test_cipher.rs:51:75:51:81 | const10 [element] | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | provenance | | | test_cipher.rs:73:9:73:14 | const2 [&ref] | test_cipher.rs:74:46:74:51 | const2 [&ref] | provenance | | | test_cipher.rs:73:18:73:26 | &... [&ref] | test_cipher.rs:73:9:73:14 | const2 [&ref] | provenance | | @@ -55,11 +55,17 @@ edges | test_cookie.rs:22:26:22:32 | &array2 [&ref] | test_cookie.rs:22:16:22:24 | ...::from | provenance | MaD:6 Sink:MaD:6 | | test_cookie.rs:22:27:22:32 | array2 | test_cookie.rs:22:26:22:32 | &array2 [&ref] | provenance | | | test_cookie.rs:38:9:38:14 | array2 | test_cookie.rs:42:34:42:39 | array2 | provenance | | +| test_cookie.rs:38:9:38:14 | array2 [element] | test_cookie.rs:42:34:42:39 | array2 [element] | provenance | | | test_cookie.rs:38:18:38:37 | ...::from(...) | test_cookie.rs:38:9:38:14 | array2 | provenance | | -| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:8 | +| test_cookie.rs:38:18:38:37 | ...::from(...) [element] | test_cookie.rs:38:9:38:14 | array2 [element] | provenance | | +| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:11 | +| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:10 | +| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) [element] | provenance | MaD:8 | +| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) [element] | provenance | MaD:9 | | test_cookie.rs:42:34:42:39 | array2 | test_cookie.rs:42:14:42:32 | ...::from | provenance | MaD:2 Sink:MaD:2 | +| test_cookie.rs:42:34:42:39 | array2 [element] | test_cookie.rs:42:14:42:32 | ...::from | provenance | MaD:2 Sink:MaD:2 | | test_cookie.rs:49:9:49:14 | array3 [element] | test_cookie.rs:53:34:53:39 | array3 [element] | provenance | | -| test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | provenance | MaD:10 | +| test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | provenance | MaD:13 | | test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | test_cookie.rs:49:9:49:14 | array3 [element] | provenance | | | test_cookie.rs:53:34:53:39 | array3 [element] | test_cookie.rs:53:14:53:32 | ...::from | provenance | MaD:2 Sink:MaD:2 | models @@ -70,9 +76,12 @@ models | 5 | Sink: ::new; Argument[1]; credentials-iv | | 6 | Sink: ::from; Argument[0].Reference; credentials-key | | 7 | Source: core::mem::zeroed; ReturnValue.Element; constant-source | -| 8 | Summary: <_ as core::convert::From>::from; Argument[0]; ReturnValue; taint | -| 9 | Summary: ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | -| 10 | Summary: alloc::vec::from_elem; Argument[0]; ReturnValue.Element; value | +| 8 | Summary: <_ as core::convert::From>::from; Argument[0].Element; ReturnValue.Element; taint | +| 9 | Summary: <_ as core::convert::From>::from; Argument[0].Reference.Element; ReturnValue.Element; taint | +| 10 | Summary: <_ as core::convert::From>::from; Argument[0].Reference; ReturnValue; taint | +| 11 | Summary: <_ as core::convert::From>::from; Argument[0]; ReturnValue; taint | +| 12 | Summary: ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | +| 13 | Summary: alloc::vec::from_elem; Argument[0]; ReturnValue.Element; value | nodes | test_cipher.rs:18:9:18:14 | const1 [&ref] | semmle.label | const1 [&ref] | | test_cipher.rs:18:28:18:36 | &... [&ref] | semmle.label | &... [&ref] | @@ -127,10 +136,13 @@ nodes | test_cookie.rs:22:26:22:32 | &array2 [&ref] | semmle.label | &array2 [&ref] | | test_cookie.rs:22:27:22:32 | array2 | semmle.label | array2 | | test_cookie.rs:38:9:38:14 | array2 | semmle.label | array2 | +| test_cookie.rs:38:9:38:14 | array2 [element] | semmle.label | array2 [element] | | test_cookie.rs:38:18:38:37 | ...::from(...) | semmle.label | ...::from(...) | +| test_cookie.rs:38:18:38:37 | ...::from(...) [element] | semmle.label | ...::from(...) [element] | | test_cookie.rs:38:28:38:36 | [0u8; 64] | semmle.label | [0u8; 64] | | test_cookie.rs:42:14:42:32 | ...::from | semmle.label | ...::from | | test_cookie.rs:42:34:42:39 | array2 | semmle.label | array2 | +| test_cookie.rs:42:34:42:39 | array2 [element] | semmle.label | array2 [element] | | test_cookie.rs:49:9:49:14 | array3 [element] | semmle.label | array3 [element] | | test_cookie.rs:49:23:49:25 | 0u8 | semmle.label | 0u8 | | test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | semmle.label | ...::from_elem(...) [element] |