Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions rust/ql/lib/change-notes/2025-11-19-models.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* Created more robust models for various kinds of type conversions.
16 changes: 13 additions & 3 deletions rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
- ["<core::result::Result>::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"]
- ["<_ as value_trait::array::Array>::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"]
Expand Down
40 changes: 36 additions & 4 deletions rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down Expand Up @@ -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 |
Expand Down Expand Up @@ -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(...) |
65 changes: 43 additions & 22 deletions rust/ql/test/library-tests/dataflow/local/inline-flow.expected
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
models
| 1 | Summary: <alloc::boxed::Box>::new; Argument[0]; ReturnValue.Reference; value |
| 2 | Summary: <core::option::Option>::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
| 3 | Summary: <core::option::Option>::unwrap_or; Argument[0]; ReturnValue; value |
| 4 | Summary: <core::option::Option>::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
| 5 | Summary: <core::option::Option>::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value |
| 6 | Summary: <core::option::Option>::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
| 7 | Summary: <core::result::Result>::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value |
| 8 | Summary: <core::result::Result>::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
| 9 | Summary: <core::result::Result>::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value |
| 10 | Summary: <core::result::Result>::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: <alloc::boxed::Box>::new; Argument[0]; ReturnValue.Reference; value |
| 4 | Summary: <core::i64 as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value |
| 5 | Summary: <core::option::Option>::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
| 6 | Summary: <core::option::Option>::unwrap_or; Argument[0]; ReturnValue; value |
| 7 | Summary: <core::option::Option>::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
| 8 | Summary: <core::option::Option>::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value |
| 9 | Summary: <core::option::Option>::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
| 10 | Summary: <core::result::Result>::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value |
| 11 | Summary: <core::result::Result>::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
| 12 | Summary: <core::result::Result>::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value |
| 13 | Summary: <core::result::Result>::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 | |
Expand Down Expand Up @@ -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 | |
Expand Down Expand Up @@ -117,43 +120,43 @@ 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 | |
| main.rs:322:35:322:44 | source(...) | main.rs:322:32:322:45 | Ok(...) [Ok] | provenance | |
| 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 | |
Expand Down Expand Up @@ -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 |
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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(...) |
15 changes: 15 additions & 0 deletions rust/ql/test/library-tests/dataflow/local/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -619,4 +633,5 @@ fn main() {
iterators();
references();
conversions();
clone();
}
Original file line number Diff line number Diff line change
@@ -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() |
Loading