Skip to content

Commit 1622d08

Browse files
committed
Rust: Add inferArrayExprType.
1 parent 639f85a commit 1622d08

File tree

3 files changed

+42
-2
lines changed

3 files changed

+42
-2
lines changed

rust/ql/lib/codeql/rust/internal/TypeInference.qll

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,6 +1102,12 @@ private class Vec extends Struct {
11021102
}
11031103
}
11041104

1105+
/**
1106+
* Gets the root type of the array expression `ae`.
1107+
*/
1108+
pragma[nomagic]
1109+
private Type inferArrayExprType(ArrayExpr ae) { exists(ae) and result = TArrayType() }
1110+
11051111
/**
11061112
* According to [the Rust reference][1]: _"array and slice-typed expressions
11071113
* can be indexed with a `usize` index ... For other types an index expression
@@ -1595,6 +1601,9 @@ private module Cached {
15951601
or
15961602
result = inferAwaitExprType(n, path)
15971603
or
1604+
result = inferArrayExprType(n) and
1605+
path.isEmpty()
1606+
or
15981607
result = inferIndexExprType(n, path)
15991608
or
16001609
result = inferForLoopExprType(n, path)

rust/ql/test/library-tests/type-inference/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1890,8 +1890,8 @@ mod loops {
18901890
// for loops with arrays
18911891

18921892
for i in [1, 2, 3] { } // $ type=i:i32
1893-
for i in [1, 2, 3].map(|x| x + 1) { } // $ MISSING: type=i:i32
1894-
for i in [1, 2, 3].into_iter() { } // $ MISSING: type=i:i32
1893+
for i in [1, 2, 3].map(|x| x + 1) { } // $ method=map MISSING: type=i:i32
1894+
for i in [1, 2, 3].into_iter() { } // $ method=into_iter MISSING: type=i:i32
18951895

18961896
let vals1 = [1u8, 2, 3]; // $ MISSING: type=vals1:[u8; 3]
18971897
for u in vals1 { } // $ type=u:u8

rust/ql/test/library-tests/type-inference/type-inference.expected

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2698,21 +2698,27 @@ inferType
26982698
| main.rs:1885:13:1885:13 | 1 | | {EXTERNAL LOCATION} | i32 |
26992699
| main.rs:1885:13:1885:13 | 1 | | {EXTERNAL LOCATION} | i64 |
27002700
| main.rs:1892:13:1892:13 | i | | {EXTERNAL LOCATION} | i32 |
2701+
| main.rs:1892:18:1892:26 | [...] | | file://:0:0:0:0 | [] |
27012702
| main.rs:1892:18:1892:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 |
27022703
| main.rs:1892:19:1892:19 | 1 | | {EXTERNAL LOCATION} | i32 |
27032704
| main.rs:1892:22:1892:22 | 2 | | {EXTERNAL LOCATION} | i32 |
27042705
| main.rs:1892:25:1892:25 | 3 | | {EXTERNAL LOCATION} | i32 |
2706+
| main.rs:1893:18:1893:26 | [...] | | file://:0:0:0:0 | [] |
27052707
| main.rs:1893:18:1893:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 |
2708+
| main.rs:1893:18:1893:41 | ... .map(...) | | file://:0:0:0:0 | [] |
27062709
| main.rs:1893:19:1893:19 | 1 | | {EXTERNAL LOCATION} | i32 |
27072710
| main.rs:1893:22:1893:22 | 2 | | {EXTERNAL LOCATION} | i32 |
27082711
| main.rs:1893:25:1893:25 | 3 | | {EXTERNAL LOCATION} | i32 |
27092712
| main.rs:1893:40:1893:40 | 1 | | {EXTERNAL LOCATION} | i32 |
2713+
| main.rs:1894:18:1894:26 | [...] | | file://:0:0:0:0 | [] |
27102714
| main.rs:1894:18:1894:26 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 |
27112715
| main.rs:1894:19:1894:19 | 1 | | {EXTERNAL LOCATION} | i32 |
27122716
| main.rs:1894:22:1894:22 | 2 | | {EXTERNAL LOCATION} | i32 |
27132717
| main.rs:1894:25:1894:25 | 3 | | {EXTERNAL LOCATION} | i32 |
2718+
| main.rs:1896:13:1896:17 | vals1 | | file://:0:0:0:0 | [] |
27142719
| main.rs:1896:13:1896:17 | vals1 | [T;...] | {EXTERNAL LOCATION} | i32 |
27152720
| main.rs:1896:13:1896:17 | vals1 | [T;...] | {EXTERNAL LOCATION} | u8 |
2721+
| main.rs:1896:21:1896:31 | [...] | | file://:0:0:0:0 | [] |
27162722
| main.rs:1896:21:1896:31 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 |
27172723
| main.rs:1896:21:1896:31 | [...] | [T;...] | {EXTERNAL LOCATION} | u8 |
27182724
| main.rs:1896:22:1896:24 | 1u8 | | {EXTERNAL LOCATION} | i32 |
@@ -2723,13 +2729,17 @@ inferType
27232729
| main.rs:1896:30:1896:30 | 3 | | {EXTERNAL LOCATION} | u8 |
27242730
| main.rs:1897:13:1897:13 | u | | {EXTERNAL LOCATION} | i32 |
27252731
| main.rs:1897:13:1897:13 | u | | {EXTERNAL LOCATION} | u8 |
2732+
| main.rs:1897:18:1897:22 | vals1 | | file://:0:0:0:0 | [] |
27262733
| main.rs:1897:18:1897:22 | vals1 | [T;...] | {EXTERNAL LOCATION} | i32 |
27272734
| main.rs:1897:18:1897:22 | vals1 | [T;...] | {EXTERNAL LOCATION} | u8 |
2735+
| main.rs:1899:13:1899:17 | vals2 | | file://:0:0:0:0 | [] |
27282736
| main.rs:1899:13:1899:17 | vals2 | [T;...] | {EXTERNAL LOCATION} | u16 |
2737+
| main.rs:1899:21:1899:29 | [1u16; 3] | | file://:0:0:0:0 | [] |
27292738
| main.rs:1899:21:1899:29 | [1u16; 3] | [T;...] | {EXTERNAL LOCATION} | u16 |
27302739
| main.rs:1899:22:1899:25 | 1u16 | | {EXTERNAL LOCATION} | u16 |
27312740
| main.rs:1899:28:1899:28 | 3 | | {EXTERNAL LOCATION} | i32 |
27322741
| main.rs:1900:13:1900:13 | u | | {EXTERNAL LOCATION} | u16 |
2742+
| main.rs:1900:18:1900:22 | vals2 | | file://:0:0:0:0 | [] |
27332743
| main.rs:1900:18:1900:22 | vals2 | [T;...] | {EXTERNAL LOCATION} | u16 |
27342744
| main.rs:1902:13:1902:17 | vals3 | | file://:0:0:0:0 | [] |
27352745
| main.rs:1902:13:1902:17 | vals3 | [T;...] | {EXTERNAL LOCATION} | i32 |
@@ -2764,20 +2774,29 @@ inferType
27642774
| main.rs:1906:18:1906:22 | vals4 | | file://:0:0:0:0 | [] |
27652775
| main.rs:1906:18:1906:22 | vals4 | [T;...] | {EXTERNAL LOCATION} | i32 |
27662776
| main.rs:1906:18:1906:22 | vals4 | [T;...] | {EXTERNAL LOCATION} | u64 |
2777+
| main.rs:1908:13:1908:24 | mut strings1 | | file://:0:0:0:0 | [] |
27672778
| main.rs:1908:13:1908:24 | mut strings1 | [T;...] | {EXTERNAL LOCATION} | str |
2779+
| main.rs:1908:28:1908:48 | [...] | | file://:0:0:0:0 | [] |
27682780
| main.rs:1908:28:1908:48 | [...] | [T;...] | {EXTERNAL LOCATION} | str |
27692781
| main.rs:1908:29:1908:33 | "foo" | | {EXTERNAL LOCATION} | str |
27702782
| main.rs:1908:36:1908:40 | "bar" | | {EXTERNAL LOCATION} | str |
27712783
| main.rs:1908:43:1908:47 | "baz" | | {EXTERNAL LOCATION} | str |
27722784
| main.rs:1909:18:1909:26 | &strings1 | | file://:0:0:0:0 | & |
2785+
| main.rs:1909:18:1909:26 | &strings1 | &T | file://:0:0:0:0 | [] |
27732786
| main.rs:1909:18:1909:26 | &strings1 | &T.[T;...] | {EXTERNAL LOCATION} | str |
2787+
| main.rs:1909:19:1909:26 | strings1 | | file://:0:0:0:0 | [] |
27742788
| main.rs:1909:19:1909:26 | strings1 | [T;...] | {EXTERNAL LOCATION} | str |
27752789
| main.rs:1910:18:1910:30 | &mut strings1 | | file://:0:0:0:0 | & |
2790+
| main.rs:1910:18:1910:30 | &mut strings1 | &T | file://:0:0:0:0 | [] |
27762791
| main.rs:1910:18:1910:30 | &mut strings1 | &T.[T;...] | {EXTERNAL LOCATION} | str |
2792+
| main.rs:1910:23:1910:30 | strings1 | | file://:0:0:0:0 | [] |
27772793
| main.rs:1910:23:1910:30 | strings1 | [T;...] | {EXTERNAL LOCATION} | str |
27782794
| main.rs:1911:13:1911:13 | s | | {EXTERNAL LOCATION} | str |
2795+
| main.rs:1911:18:1911:25 | strings1 | | file://:0:0:0:0 | [] |
27792796
| main.rs:1911:18:1911:25 | strings1 | [T;...] | {EXTERNAL LOCATION} | str |
2797+
| main.rs:1913:13:1913:20 | strings2 | | file://:0:0:0:0 | [] |
27802798
| main.rs:1913:13:1913:20 | strings2 | [T;...] | {EXTERNAL LOCATION} | String |
2799+
| main.rs:1913:24:1913:86 | [...] | | file://:0:0:0:0 | [] |
27812800
| main.rs:1913:24:1913:86 | [...] | [T;...] | {EXTERNAL LOCATION} | String |
27822801
| main.rs:1913:25:1913:43 | ...::from(...) | | {EXTERNAL LOCATION} | String |
27832802
| main.rs:1913:38:1913:42 | "foo" | | {EXTERNAL LOCATION} | str |
@@ -2786,11 +2805,15 @@ inferType
27862805
| main.rs:1913:67:1913:85 | ...::from(...) | | {EXTERNAL LOCATION} | String |
27872806
| main.rs:1913:80:1913:84 | "baz" | | {EXTERNAL LOCATION} | str |
27882807
| main.rs:1914:13:1914:13 | s | | {EXTERNAL LOCATION} | String |
2808+
| main.rs:1914:18:1914:25 | strings2 | | file://:0:0:0:0 | [] |
27892809
| main.rs:1914:18:1914:25 | strings2 | [T;...] | {EXTERNAL LOCATION} | String |
27902810
| main.rs:1916:13:1916:20 | strings3 | | file://:0:0:0:0 | & |
2811+
| main.rs:1916:13:1916:20 | strings3 | &T | file://:0:0:0:0 | [] |
27912812
| main.rs:1916:13:1916:20 | strings3 | &T.[T;...] | {EXTERNAL LOCATION} | String |
27922813
| main.rs:1916:24:1916:87 | &... | | file://:0:0:0:0 | & |
2814+
| main.rs:1916:24:1916:87 | &... | &T | file://:0:0:0:0 | [] |
27932815
| main.rs:1916:24:1916:87 | &... | &T.[T;...] | {EXTERNAL LOCATION} | String |
2816+
| main.rs:1916:25:1916:87 | [...] | | file://:0:0:0:0 | [] |
27942817
| main.rs:1916:25:1916:87 | [...] | [T;...] | {EXTERNAL LOCATION} | String |
27952818
| main.rs:1916:26:1916:44 | ...::from(...) | | {EXTERNAL LOCATION} | String |
27962819
| main.rs:1916:39:1916:43 | "foo" | | {EXTERNAL LOCATION} | str |
@@ -2799,19 +2822,24 @@ inferType
27992822
| main.rs:1916:68:1916:86 | ...::from(...) | | {EXTERNAL LOCATION} | String |
28002823
| main.rs:1916:81:1916:85 | "baz" | | {EXTERNAL LOCATION} | str |
28012824
| main.rs:1917:18:1917:25 | strings3 | | file://:0:0:0:0 | & |
2825+
| main.rs:1917:18:1917:25 | strings3 | &T | file://:0:0:0:0 | [] |
28022826
| main.rs:1917:18:1917:25 | strings3 | &T.[T;...] | {EXTERNAL LOCATION} | String |
2827+
| main.rs:1919:13:1919:21 | callables | | file://:0:0:0:0 | [] |
28032828
| main.rs:1919:13:1919:21 | callables | [T;...] | main.rs:1876:5:1877:5 | MyCallable |
2829+
| main.rs:1919:25:1919:81 | [...] | | file://:0:0:0:0 | [] |
28042830
| main.rs:1919:25:1919:81 | [...] | [T;...] | main.rs:1876:5:1877:5 | MyCallable |
28052831
| main.rs:1919:26:1919:42 | ...::new(...) | | main.rs:1876:5:1877:5 | MyCallable |
28062832
| main.rs:1919:45:1919:61 | ...::new(...) | | main.rs:1876:5:1877:5 | MyCallable |
28072833
| main.rs:1919:64:1919:80 | ...::new(...) | | main.rs:1876:5:1877:5 | MyCallable |
28082834
| main.rs:1920:13:1920:13 | c | | main.rs:1876:5:1877:5 | MyCallable |
2835+
| main.rs:1920:18:1920:26 | callables | | file://:0:0:0:0 | [] |
28092836
| main.rs:1920:18:1920:26 | callables | [T;...] | main.rs:1876:5:1877:5 | MyCallable |
28102837
| main.rs:1921:17:1921:22 | result | | {EXTERNAL LOCATION} | i64 |
28112838
| main.rs:1921:26:1921:26 | c | | main.rs:1876:5:1877:5 | MyCallable |
28122839
| main.rs:1921:26:1921:33 | c.call() | | {EXTERNAL LOCATION} | i64 |
28132840
| main.rs:1926:18:1926:18 | 0 | | {EXTERNAL LOCATION} | i32 |
28142841
| main.rs:1926:21:1926:22 | 10 | | {EXTERNAL LOCATION} | i32 |
2842+
| main.rs:1927:18:1927:28 | [...] | | file://:0:0:0:0 | [] |
28152843
| main.rs:1927:19:1927:21 | 0u8 | | {EXTERNAL LOCATION} | u8 |
28162844
| main.rs:1927:26:1927:27 | 10 | | {EXTERNAL LOCATION} | i32 |
28172845
| main.rs:1929:13:1929:18 | range1 | | {EXTERNAL LOCATION} | Range |
@@ -2825,6 +2853,7 @@ inferType
28252853
| main.rs:1934:26:1934:26 | 1 | | {EXTERNAL LOCATION} | i32 |
28262854
| main.rs:1934:29:1934:29 | 2 | | {EXTERNAL LOCATION} | i32 |
28272855
| main.rs:1934:32:1934:32 | 3 | | {EXTERNAL LOCATION} | i32 |
2856+
| main.rs:1937:21:1937:32 | [...] | | file://:0:0:0:0 | [] |
28282857
| main.rs:1937:21:1937:32 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 |
28292858
| main.rs:1937:21:1937:32 | [...] | [T;...] | {EXTERNAL LOCATION} | u16 |
28302859
| main.rs:1937:22:1937:25 | 1u16 | | {EXTERNAL LOCATION} | i32 |
@@ -2839,6 +2868,7 @@ inferType
28392868
| main.rs:1940:21:1940:43 | ...::from(...) | | {EXTERNAL LOCATION} | Vec |
28402869
| main.rs:1940:21:1940:43 | ...::from(...) | A | {EXTERNAL LOCATION} | Global |
28412870
| main.rs:1940:21:1940:43 | ...::from(...) | T | {EXTERNAL LOCATION} | u8 |
2871+
| main.rs:1940:31:1940:42 | [...] | | file://:0:0:0:0 | [] |
28422872
| main.rs:1940:31:1940:42 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 |
28432873
| main.rs:1940:31:1940:42 | [...] | [T;...] | {EXTERNAL LOCATION} | u32 |
28442874
| main.rs:1940:32:1940:35 | 1u32 | | {EXTERNAL LOCATION} | i32 |
@@ -2855,6 +2885,7 @@ inferType
28552885
| main.rs:1943:13:1943:17 | vals6 | A | {EXTERNAL LOCATION} | Global |
28562886
| main.rs:1943:13:1943:17 | vals6 | T | file://:0:0:0:0 | & |
28572887
| main.rs:1943:13:1943:17 | vals6 | T.&T | {EXTERNAL LOCATION} | u64 |
2888+
| main.rs:1943:33:1943:44 | [...] | | file://:0:0:0:0 | [] |
28582889
| main.rs:1943:33:1943:44 | [...] | [T;...] | {EXTERNAL LOCATION} | i32 |
28592890
| main.rs:1943:33:1943:44 | [...] | [T;...] | {EXTERNAL LOCATION} | u64 |
28602891
| main.rs:1943:33:1943:61 | ... .collect() | | {EXTERNAL LOCATION} | Vec |

0 commit comments

Comments
 (0)