Skip to content

Commit 1df2578

Browse files
committed
Rust: Model [T;n] -> [T] unsized coercions as implicit derefs
1 parent f8a0343 commit 1df2578

7 files changed

Lines changed: 252 additions & 71 deletions

File tree

rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ extensions:
77
- ["<& as core::ops::deref::Deref>::deref", "Argument[self].Reference", "ReturnValue", "value", "manual"]
88
- ["<&mut as core::ops::deref::Deref>::deref", "Argument[self].Reference", "ReturnValue", "value", "manual"]
99
- ["core::ops::deref::Deref::deref", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"]
10+
# for the pseudo implementation in `builtins/types.rs`
11+
- ["<[;] as core::ops::deref::Deref>::deref", "Argument[self].Reference", "ReturnValue.Reference", "value", "manual"]
1012
# Index
1113
- ["core::ops::index::Index::index", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"]
1214
- ["core::ops::index::IndexMut::index_mut", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"]
@@ -135,6 +137,7 @@ extensions:
135137
- ["core::cmp::Ord::clamp", "Argument[self,0,1]", "ReturnValue", "value", "manual"]
136138
# Slice
137139
- ["<[]>::get", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "value", "manual"]
140+
- ["<[]>::iter", "Argument[self].Reference.Element", "ReturnValue.Element.Reference", "value", "manual"]
138141
- addsTo:
139142
pack: codeql/rust-all
140143
extensible: sourceModel

rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -763,6 +763,7 @@ localStep
763763
| main.rs:535:20:535:20 | x | main.rs:535:20:535:20 | x |
764764
| main.rs:536:5:536:6 | [post] vs | main.rs:538:14:538:15 | vs |
765765
| main.rs:536:5:536:6 | vs | main.rs:538:14:538:15 | vs |
766+
| main.rs:536:24:536:35 | \|...\| ... | main.rs:536:24:536:35 | \|...\| ... |
766767
| main.rs:536:25:536:25 | ... | main.rs:536:25:536:25 | x |
767768
| main.rs:536:25:536:25 | [SSA] x | main.rs:536:34:536:34 | x |
768769
| main.rs:536:25:536:25 | x | main.rs:536:25:536:25 | [SSA] x |
@@ -944,26 +945,57 @@ readStep
944945
| main.rs:519:10:519:11 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:519:10:519:11 | [post] vs |
945946
| main.rs:519:10:519:14 | vs[0] [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:519:10:519:14 | vs[0] |
946947
| main.rs:520:10:520:35 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:520:10:520:35 | * ... |
948+
| main.rs:520:11:520:12 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:520:11:520:12 | [post] vs [implicit deref 0 in state after deref] |
949+
| main.rs:520:11:520:12 | [post] vs [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:520:11:520:12 | [post] vs |
950+
| main.rs:520:11:520:12 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:520:11:520:12 | vs [implicit deref 0 in state after deref] |
951+
| main.rs:520:11:520:19 | [post] vs.iter() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:520:11:520:19 | [post] vs.iter() |
947952
| main.rs:520:11:520:35 | [post] ... .unwrap() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:520:11:520:35 | [post] ... .unwrap() |
948953
| main.rs:521:10:521:35 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:521:10:521:35 | * ... |
954+
| main.rs:521:11:521:12 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:521:11:521:12 | [post] vs [implicit deref 0 in state after deref] |
955+
| main.rs:521:11:521:12 | [post] vs [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:521:11:521:12 | [post] vs |
956+
| main.rs:521:11:521:12 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:521:11:521:12 | vs [implicit deref 0 in state after deref] |
957+
| main.rs:521:11:521:19 | [post] vs.iter() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:521:11:521:19 | [post] vs.iter() |
949958
| main.rs:521:11:521:35 | [post] ... .unwrap() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:521:11:521:35 | [post] ... .unwrap() |
950959
| main.rs:523:14:523:15 | vs | file://:0:0:0:0 | element | main.rs:523:9:523:9 | v |
951960
| main.rs:526:9:526:10 | &... | file://:0:0:0:0 | &ref | main.rs:526:10:526:10 | v |
961+
| main.rs:526:15:526:16 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:526:15:526:16 | [post] vs [implicit deref 0 in state after deref] |
962+
| main.rs:526:15:526:16 | [post] vs [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:526:15:526:16 | [post] vs |
963+
| main.rs:526:15:526:16 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:526:15:526:16 | vs [implicit deref 0 in state after deref] |
952964
| main.rs:526:15:526:23 | vs.iter() | file://:0:0:0:0 | element | main.rs:526:9:526:10 | &... |
965+
| main.rs:530:26:530:27 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:530:26:530:27 | [post] vs [implicit deref 0 in state after deref] |
966+
| main.rs:530:26:530:27 | [post] vs [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:530:26:530:27 | [post] vs |
967+
| main.rs:530:26:530:27 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:530:26:530:27 | vs [implicit deref 0 in state after deref] |
953968
| main.rs:531:9:531:10 | &... | file://:0:0:0:0 | &ref | main.rs:531:10:531:10 | v |
954969
| main.rs:531:15:531:17 | vs2 | file://:0:0:0:0 | element | main.rs:531:9:531:10 | &... |
970+
| main.rs:535:5:535:6 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:535:5:535:6 | [post] vs [implicit deref 0 in state after deref] |
971+
| main.rs:535:5:535:6 | [post] vs [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:535:5:535:6 | [post] vs |
972+
| main.rs:535:5:535:6 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:535:5:535:6 | vs [implicit deref 0 in state after deref] |
955973
| main.rs:535:28:535:29 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:535:28:535:29 | * ... |
956974
| main.rs:535:29:535:29 | [post] x [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:535:29:535:29 | [post] x |
975+
| main.rs:536:5:536:6 | [post] vs [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:536:5:536:6 | [post] vs [implicit deref 0 in state after deref] |
976+
| main.rs:536:5:536:6 | [post] vs [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:536:5:536:6 | [post] vs |
977+
| main.rs:536:5:536:6 | vs [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:536:5:536:6 | vs [implicit deref 0 in state after deref] |
957978
| main.rs:536:33:536:34 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:536:33:536:34 | * ... |
958979
| main.rs:536:34:536:34 | [post] x [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:536:34:536:34 | [post] x |
959980
| main.rs:538:14:538:27 | vs.into_iter() | file://:0:0:0:0 | element | main.rs:538:9:538:9 | v |
960981
| main.rs:544:10:544:15 | [post] vs_mut [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:544:10:544:15 | [post] vs_mut |
961982
| main.rs:544:10:544:18 | vs_mut[0] [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:544:10:544:18 | vs_mut[0] |
962983
| main.rs:545:10:545:39 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:545:10:545:39 | * ... |
984+
| main.rs:545:11:545:16 | [post] vs_mut [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:545:11:545:16 | [post] vs_mut [implicit deref 0 in state after deref] |
985+
| main.rs:545:11:545:16 | [post] vs_mut [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:545:11:545:16 | [post] vs_mut |
986+
| main.rs:545:11:545:16 | vs_mut [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:545:11:545:16 | vs_mut [implicit deref 0 in state after deref] |
987+
| main.rs:545:11:545:23 | [post] vs_mut.iter() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:545:11:545:23 | [post] vs_mut.iter() |
963988
| main.rs:545:11:545:39 | [post] ... .unwrap() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:545:11:545:39 | [post] ... .unwrap() |
964989
| main.rs:546:10:546:39 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:546:10:546:39 | * ... |
990+
| main.rs:546:11:546:16 | [post] vs_mut [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:546:11:546:16 | [post] vs_mut [implicit deref 0 in state after deref] |
991+
| main.rs:546:11:546:16 | [post] vs_mut [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:546:11:546:16 | [post] vs_mut |
992+
| main.rs:546:11:546:16 | vs_mut [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:546:11:546:16 | vs_mut [implicit deref 0 in state after deref] |
993+
| main.rs:546:11:546:23 | [post] vs_mut.iter() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:546:11:546:23 | [post] vs_mut.iter() |
965994
| main.rs:546:11:546:39 | [post] ... .unwrap() [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:546:11:546:39 | [post] ... .unwrap() |
966995
| main.rs:548:9:548:14 | &mut ... | file://:0:0:0:0 | &ref | main.rs:548:14:548:14 | v |
996+
| main.rs:548:19:548:24 | [post] vs_mut [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:548:19:548:24 | [post] vs_mut [implicit deref 0 in state after deref] |
997+
| main.rs:548:19:548:24 | [post] vs_mut [implicit deref 0 in state after borrow] | file://:0:0:0:0 | &ref | main.rs:548:19:548:24 | [post] vs_mut |
998+
| main.rs:548:19:548:24 | vs_mut [implicit deref 0 in state before deref] | file://:0:0:0:0 | &ref | main.rs:548:19:548:24 | vs_mut [implicit deref 0 in state after deref] |
967999
| main.rs:548:19:548:35 | vs_mut.iter_mut() | file://:0:0:0:0 | element | main.rs:548:9:548:14 | &mut ... |
9681000
| main.rs:562:10:562:15 | * ... [pre-dereferenced] | file://:0:0:0:0 | &ref | main.rs:562:10:562:15 | * ... |
9691001
| main.rs:562:11:562:15 | [post] c_ref [implicit borrow] | file://:0:0:0:0 | &ref | main.rs:562:11:562:15 | [post] c_ref |
@@ -1069,17 +1101,39 @@ storeStep
10691101
| main.rs:517:30:517:30 | 3 | file://:0:0:0:0 | element | main.rs:517:14:517:34 | [...] |
10701102
| main.rs:517:33:517:33 | 4 | file://:0:0:0:0 | element | main.rs:517:14:517:34 | [...] |
10711103
| main.rs:519:10:519:11 | vs | file://:0:0:0:0 | &ref | main.rs:519:10:519:11 | vs [implicit borrow] |
1104+
| main.rs:520:11:520:12 | vs | file://:0:0:0:0 | &ref | main.rs:520:11:520:12 | vs [implicit deref 0 in state after borrow] |
1105+
| main.rs:520:11:520:12 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:520:11:520:12 | vs [implicit borrow] |
1106+
| main.rs:520:11:520:19 | vs.iter() | file://:0:0:0:0 | &ref | main.rs:520:11:520:19 | vs.iter() [implicit borrow] |
10721107
| main.rs:520:11:520:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:520:11:520:35 | ... .unwrap() [implicit borrow] |
1108+
| main.rs:521:11:521:12 | vs | file://:0:0:0:0 | &ref | main.rs:521:11:521:12 | vs [implicit deref 0 in state after borrow] |
1109+
| main.rs:521:11:521:12 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:521:11:521:12 | vs [implicit borrow] |
1110+
| main.rs:521:11:521:19 | vs.iter() | file://:0:0:0:0 | &ref | main.rs:521:11:521:19 | vs.iter() [implicit borrow] |
10731111
| main.rs:521:11:521:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:521:11:521:35 | ... .unwrap() [implicit borrow] |
1112+
| main.rs:526:15:526:16 | vs | file://:0:0:0:0 | &ref | main.rs:526:15:526:16 | vs [implicit deref 0 in state after borrow] |
1113+
| main.rs:526:15:526:16 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:526:15:526:16 | vs [implicit borrow] |
1114+
| main.rs:530:26:530:27 | vs | file://:0:0:0:0 | &ref | main.rs:530:26:530:27 | vs [implicit deref 0 in state after borrow] |
1115+
| main.rs:530:26:530:27 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:530:26:530:27 | vs [implicit borrow] |
1116+
| main.rs:535:5:535:6 | vs | file://:0:0:0:0 | &ref | main.rs:535:5:535:6 | vs [implicit deref 0 in state after borrow] |
1117+
| main.rs:535:5:535:6 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:535:5:535:6 | vs [implicit borrow] |
10741118
| main.rs:535:29:535:29 | x | file://:0:0:0:0 | &ref | main.rs:535:29:535:29 | x [implicit borrow] |
1119+
| main.rs:536:5:536:6 | vs | file://:0:0:0:0 | &ref | main.rs:536:5:536:6 | vs [implicit deref 0 in state after borrow] |
1120+
| main.rs:536:5:536:6 | vs [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:536:5:536:6 | vs [implicit borrow] |
10751121
| main.rs:536:34:536:34 | x | file://:0:0:0:0 | &ref | main.rs:536:34:536:34 | x [implicit borrow] |
10761122
| main.rs:542:23:542:32 | source(...) | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] |
10771123
| main.rs:542:35:542:35 | 2 | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] |
10781124
| main.rs:542:38:542:38 | 3 | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] |
10791125
| main.rs:542:41:542:41 | 4 | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] |
10801126
| main.rs:544:10:544:15 | vs_mut | file://:0:0:0:0 | &ref | main.rs:544:10:544:15 | vs_mut [implicit borrow] |
1127+
| main.rs:545:11:545:16 | vs_mut | file://:0:0:0:0 | &ref | main.rs:545:11:545:16 | vs_mut [implicit deref 0 in state after borrow] |
1128+
| main.rs:545:11:545:16 | vs_mut [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:545:11:545:16 | vs_mut [implicit borrow] |
1129+
| main.rs:545:11:545:23 | vs_mut.iter() | file://:0:0:0:0 | &ref | main.rs:545:11:545:23 | vs_mut.iter() [implicit borrow] |
10811130
| main.rs:545:11:545:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:545:11:545:39 | ... .unwrap() [implicit borrow] |
1131+
| main.rs:546:11:546:16 | vs_mut | file://:0:0:0:0 | &ref | main.rs:546:11:546:16 | vs_mut [implicit deref 0 in state after borrow] |
1132+
| main.rs:546:11:546:16 | vs_mut [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:546:11:546:16 | vs_mut [implicit borrow] |
1133+
| main.rs:546:11:546:23 | vs_mut.iter() | file://:0:0:0:0 | &ref | main.rs:546:11:546:23 | vs_mut.iter() [implicit borrow] |
10821134
| main.rs:546:11:546:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:546:11:546:39 | ... .unwrap() [implicit borrow] |
1135+
| main.rs:548:19:548:24 | vs_mut | file://:0:0:0:0 | &ref | main.rs:548:19:548:24 | vs_mut [implicit deref 0 in state after borrow] |
1136+
| main.rs:548:19:548:24 | vs_mut [implicit deref 0 in state after deref] | file://:0:0:0:0 | &ref | main.rs:548:19:548:24 | vs_mut [implicit borrow] |
10831137
| main.rs:557:18:557:18 | c | file://:0:0:0:0 | &ref | main.rs:557:17:557:18 | &c |
10841138
| main.rs:560:15:560:15 | b | file://:0:0:0:0 | &ref | main.rs:560:14:560:15 | &b |
10851139
| main.rs:562:11:562:15 | c_ref | file://:0:0:0:0 | &ref | main.rs:562:11:562:15 | c_ref [implicit borrow] |

0 commit comments

Comments
 (0)