Skip to content

Commit 4e97a95

Browse files
committed
Rust: Add interprocedural tests
1 parent 9457bc3 commit 4e97a95

File tree

3 files changed

+99
-0
lines changed

3 files changed

+99
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
fn source(i: i64) -> i64 {
2+
1000 + i
3+
}
4+
5+
fn sink(s: i64) {
6+
println!("{}", s);
7+
}
8+
9+
// -----------------------------------------------------------------------------
10+
// Data flow in, out, and through functions.
11+
12+
fn get_data(n: i64) -> i64 {
13+
source(n)
14+
}
15+
16+
fn data_out_of_call() {
17+
let a = get_data(7);
18+
sink(a); // $ hasValueFlow=n
19+
}
20+
21+
fn data_in(n: i64) {
22+
sink(n + 7); // $ hasValueFlow
23+
}
24+
25+
fn data_in_to_call() {
26+
let a = source(3);
27+
data_in(a);
28+
}
29+
30+
fn pass_through(i: i64) -> i64 {
31+
i
32+
}
33+
34+
fn data_through_call() {
35+
let a = source(1);
36+
let b = pass_through(a);
37+
sink(b); // $ hasValueFlow=1
38+
}
39+
40+
// -----------------------------------------------------------------------------
41+
// Data flow in, out, and through method.
42+
43+
struct MyFlag {
44+
flag: bool,
45+
}
46+
47+
impl MyFlag {
48+
fn data_in(&self, n: i64) {
49+
sink(n); // $ hasValueFlow=1
50+
}
51+
fn get_data(&self) -> i64 {
52+
if self.flag {
53+
0
54+
} else {
55+
source(2)
56+
}
57+
}
58+
fn data_through(&self, n: i64) -> i64 {
59+
if self.flag {
60+
0
61+
} else {
62+
n
63+
}
64+
}
65+
}
66+
67+
fn data_out_of_method() {
68+
let mn = MyFlag { flag: true };
69+
let a = mn.get_data();
70+
sink(a);
71+
}
72+
73+
fn data_in_to_method_call() {
74+
let mn = MyFlag { flag: true };
75+
let a = source(1);
76+
mn.data_in(a)
77+
}
78+
79+
fn data_through_method() {
80+
let mn = MyFlag { flag: true };
81+
let a = source(4);
82+
mn.data_through(a);
83+
sink(a); // $ hasValueFlow=4
84+
}
85+
86+
fn main() {
87+
data_out_of_call();
88+
data_in_to_call();
89+
data_through_call();
90+
91+
data_out_of_method();
92+
data_in_to_method_call();
93+
data_through_method();
94+
}

rust/ql/test/library-tests/dataflow/global/viableCallable.expected

Whitespace-only changes.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import codeql.rust.dataflow.internal.DataFlowImpl
2+
3+
query predicate viableCallable(DataFlowCall call, DataFlowCallable callee) {
4+
RustDataFlow::viableCallable(call) = callee
5+
}

0 commit comments

Comments
 (0)