Skip to content

Commit e8505ad

Browse files
committed
Rust: Use type inference to resolve method calls and field accesses
1 parent 62d4e6f commit e8505ad

File tree

12 files changed

+187
-116
lines changed

12 files changed

+187
-116
lines changed

rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -847,7 +847,7 @@ class TupleFieldContent extends FieldContent, TTupleFieldContent {
847847

848848
predicate isStructField(Struct s, int pos) { field.isStructField(s, pos) }
849849

850-
override FieldExprCfgNode getAnAccess() { none() } // TODO
850+
override FieldExprCfgNode getAnAccess() { field = result.getFieldExpr().getTupleField() }
851851

852852
final override string toString() {
853853
exists(Variant v, int pos, string vname |
@@ -878,7 +878,7 @@ class RecordFieldContent extends FieldContent, TRecordFieldContent {
878878

879879
predicate isStructField(Struct s, string name) { field.isStructField(s, name) }
880880

881-
override FieldExprCfgNode getAnAccess() { none() } // TODO
881+
override FieldExprCfgNode getAnAccess() { field = result.getFieldExpr().getRecordField() }
882882

883883
final override string toString() {
884884
exists(Variant v, string name, string vname |

rust/ql/lib/codeql/rust/elements/internal/CallExprBaseImpl.qll

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@ private import codeql.rust.elements.Resolvable
1212
* be referenced directly.
1313
*/
1414
module Impl {
15-
private import codeql.rust.elements.internal.CallableImpl::Impl
16-
private import codeql.rust.elements.internal.MethodCallExprImpl::Impl
17-
private import codeql.rust.elements.internal.CallExprImpl::Impl
18-
private import codeql.rust.elements.internal.PathExprImpl::Impl
19-
private import codeql.rust.elements.internal.PathResolution
15+
private import rust
2016

2117
pragma[nomagic]
2218
Resolvable getCallResolvable(CallExprBase call) {
@@ -30,14 +26,7 @@ module Impl {
3026
* A function or method call expression. See `CallExpr` and `MethodCallExpr` for further details.
3127
*/
3228
class CallExprBase extends Generated::CallExprBase {
33-
/**
34-
* Gets the target callable of this call, if a unique such target can
35-
* be statically resolved.
36-
*/
37-
Callable getStaticTarget() {
38-
getCallResolvable(this).resolvesAsItem(result)
39-
or
40-
result = resolvePath(this.(CallExpr).getFunction().(PathExpr).getPath())
41-
}
29+
/** Gets the static target of this call, if any. */
30+
Callable getStaticTarget() { none() }
4231
}
4332
}

rust/ql/lib/codeql/rust/elements/internal/CallExprImpl.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ module Impl {
3636
class CallExpr extends Generated::CallExpr {
3737
override string toString() { result = this.getFunction().toAbbreviatedString() + "(...)" }
3838

39+
override Callable getStaticTarget() { result = getResolvedFunction(this) }
40+
3941
/** Gets the struct that this call resolves to, if any. */
4042
Struct getStruct() { result = getResolvedFunction(this) }
4143

rust/ql/lib/codeql/rust/elements/internal/MethodCallExprImpl.qll

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@
44
* INTERNAL: Do not use.
55
*/
66

7+
private import rust
78
private import codeql.rust.elements.internal.generated.MethodCallExpr
9+
private import codeql.rust.elements.internal.PathResolution
10+
private import codeql.rust.elements.internal.TypeInference
811

912
/**
1013
* INTERNAL: This module contains the customizable definition of `MethodCallExpr` and should not
1114
* be referenced directly.
1215
*/
1316
module Impl {
17+
private predicate isImplFunction(Function f) { f = any(ImplItemNode impl).getAnAssocItem() }
18+
1419
// the following QLdoc is generated: if you need to edit it, do it in the schema file
1520
/**
1621
* A method call expression. For example:
@@ -20,6 +25,23 @@ module Impl {
2025
* ```
2126
*/
2227
class MethodCallExpr extends Generated::MethodCallExpr {
28+
override Function getStaticTarget() {
29+
result = resolveMethodCallExpr(this) and
30+
(
31+
// prioritize `impl` methods first
32+
isImplFunction(result)
33+
or
34+
not isImplFunction(resolveMethodCallExpr(this)) and
35+
(
36+
// then trait methods with default implementations
37+
result.hasBody()
38+
or
39+
// and finally trait methods without default implementations
40+
not resolveMethodCallExpr(this).hasBody()
41+
)
42+
)
43+
}
44+
2345
override string toString() {
2446
exists(string base, string separator |
2547
base = this.getReceiver().toAbbreviatedString() and

rust/ql/test/library-tests/dataflow/global/inline-flow.expected

Lines changed: 37 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -60,28 +60,21 @@ edges
6060
| main.rs:134:24:134:33 | source(...) | main.rs:134:13:134:34 | ...::new(...) [MyInt] | provenance | |
6161
| main.rs:135:9:135:26 | MyInt {...} [MyInt] | main.rs:135:24:135:24 | m | provenance | |
6262
| main.rs:135:24:135:24 | m | main.rs:136:10:136:10 | m | provenance | |
63-
| main.rs:175:18:175:21 | SelfParam [MyInt] | main.rs:175:48:177:5 | { ... } [MyInt] | provenance | |
64-
| main.rs:179:26:179:37 | ...: MyInt [MyInt] | main.rs:179:49:181:5 | { ... } [MyInt] | provenance | |
65-
| main.rs:185:9:185:9 | a [MyInt] | main.rs:187:49:187:49 | a [MyInt] | provenance | |
66-
| main.rs:185:13:185:38 | MyInt {...} [MyInt] | main.rs:185:9:185:9 | a [MyInt] | provenance | |
67-
| main.rs:185:28:185:36 | source(...) | main.rs:185:13:185:38 | MyInt {...} [MyInt] | provenance | |
68-
| main.rs:187:9:187:26 | MyInt {...} [MyInt] | main.rs:187:24:187:24 | c | provenance | |
69-
| main.rs:187:24:187:24 | c | main.rs:188:10:188:10 | c | provenance | |
70-
| main.rs:187:30:187:53 | ...::take_self(...) [MyInt] | main.rs:187:9:187:26 | MyInt {...} [MyInt] | provenance | |
71-
| main.rs:187:49:187:49 | a [MyInt] | main.rs:175:18:175:21 | SelfParam [MyInt] | provenance | |
72-
| main.rs:187:49:187:49 | a [MyInt] | main.rs:187:30:187:53 | ...::take_self(...) [MyInt] | provenance | |
73-
| main.rs:191:9:191:9 | b [MyInt] | main.rs:192:54:192:54 | b [MyInt] | provenance | |
74-
| main.rs:191:13:191:39 | MyInt {...} [MyInt] | main.rs:191:9:191:9 | b [MyInt] | provenance | |
75-
| main.rs:191:28:191:37 | source(...) | main.rs:191:13:191:39 | MyInt {...} [MyInt] | provenance | |
76-
| main.rs:192:9:192:26 | MyInt {...} [MyInt] | main.rs:192:24:192:24 | c | provenance | |
77-
| main.rs:192:24:192:24 | c | main.rs:193:10:193:10 | c | provenance | |
78-
| main.rs:192:30:192:55 | ...::take_second(...) [MyInt] | main.rs:192:9:192:26 | MyInt {...} [MyInt] | provenance | |
79-
| main.rs:192:54:192:54 | b [MyInt] | main.rs:179:26:179:37 | ...: MyInt [MyInt] | provenance | |
80-
| main.rs:192:54:192:54 | b [MyInt] | main.rs:192:30:192:55 | ...::take_second(...) [MyInt] | provenance | |
81-
| main.rs:202:9:202:9 | a | main.rs:203:10:203:10 | a | provenance | |
82-
| main.rs:202:13:202:21 | source(...) | main.rs:202:9:202:9 | a | provenance | |
83-
| main.rs:212:13:212:13 | c | main.rs:213:14:213:14 | c | provenance | |
84-
| main.rs:212:17:212:25 | source(...) | main.rs:212:13:212:13 | c | provenance | |
63+
| main.rs:142:12:142:15 | SelfParam [MyInt] | main.rs:144:24:144:27 | self [MyInt] | provenance | |
64+
| main.rs:144:9:144:35 | MyInt {...} [MyInt] | main.rs:142:42:145:5 | { ... } [MyInt] | provenance | |
65+
| main.rs:144:24:144:27 | self [MyInt] | main.rs:144:24:144:33 | self.value | provenance | |
66+
| main.rs:144:24:144:33 | self.value | main.rs:144:9:144:35 | MyInt {...} [MyInt] | provenance | |
67+
| main.rs:159:9:159:9 | a [MyInt] | main.rs:142:12:142:15 | SelfParam [MyInt] | provenance | |
68+
| main.rs:159:9:159:9 | a [MyInt] | main.rs:161:13:161:20 | a.add(...) [MyInt] | provenance | |
69+
| main.rs:159:13:159:38 | MyInt {...} [MyInt] | main.rs:159:9:159:9 | a [MyInt] | provenance | |
70+
| main.rs:159:28:159:36 | source(...) | main.rs:159:13:159:38 | MyInt {...} [MyInt] | provenance | |
71+
| main.rs:161:9:161:9 | d [MyInt] | main.rs:162:10:162:10 | d [MyInt] | provenance | |
72+
| main.rs:161:13:161:20 | a.add(...) [MyInt] | main.rs:161:9:161:9 | d [MyInt] | provenance | |
73+
| main.rs:162:10:162:10 | d [MyInt] | main.rs:162:10:162:16 | d.value | provenance | |
74+
| main.rs:201:9:201:9 | a | main.rs:202:10:202:10 | a | provenance | |
75+
| main.rs:201:13:201:21 | source(...) | main.rs:201:9:201:9 | a | provenance | |
76+
| main.rs:211:13:211:13 | c | main.rs:212:14:212:14 | c | provenance | |
77+
| main.rs:211:17:211:25 | source(...) | main.rs:211:13:211:13 | c | provenance | |
8578
nodes
8679
| main.rs:12:28:14:1 | { ... } | semmle.label | { ... } |
8780
| main.rs:13:5:13:13 | source(...) | semmle.label | source(...) |
@@ -151,41 +144,32 @@ nodes
151144
| main.rs:135:9:135:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] |
152145
| main.rs:135:24:135:24 | m | semmle.label | m |
153146
| main.rs:136:10:136:10 | m | semmle.label | m |
154-
| main.rs:175:18:175:21 | SelfParam [MyInt] | semmle.label | SelfParam [MyInt] |
155-
| main.rs:175:48:177:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] |
156-
| main.rs:179:26:179:37 | ...: MyInt [MyInt] | semmle.label | ...: MyInt [MyInt] |
157-
| main.rs:179:49:181:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] |
158-
| main.rs:185:9:185:9 | a [MyInt] | semmle.label | a [MyInt] |
159-
| main.rs:185:13:185:38 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] |
160-
| main.rs:185:28:185:36 | source(...) | semmle.label | source(...) |
161-
| main.rs:187:9:187:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] |
162-
| main.rs:187:24:187:24 | c | semmle.label | c |
163-
| main.rs:187:30:187:53 | ...::take_self(...) [MyInt] | semmle.label | ...::take_self(...) [MyInt] |
164-
| main.rs:187:49:187:49 | a [MyInt] | semmle.label | a [MyInt] |
165-
| main.rs:188:10:188:10 | c | semmle.label | c |
166-
| main.rs:191:9:191:9 | b [MyInt] | semmle.label | b [MyInt] |
167-
| main.rs:191:13:191:39 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] |
168-
| main.rs:191:28:191:37 | source(...) | semmle.label | source(...) |
169-
| main.rs:192:9:192:26 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] |
170-
| main.rs:192:24:192:24 | c | semmle.label | c |
171-
| main.rs:192:30:192:55 | ...::take_second(...) [MyInt] | semmle.label | ...::take_second(...) [MyInt] |
172-
| main.rs:192:54:192:54 | b [MyInt] | semmle.label | b [MyInt] |
173-
| main.rs:193:10:193:10 | c | semmle.label | c |
174-
| main.rs:202:9:202:9 | a | semmle.label | a |
175-
| main.rs:202:13:202:21 | source(...) | semmle.label | source(...) |
176-
| main.rs:203:10:203:10 | a | semmle.label | a |
177-
| main.rs:212:13:212:13 | c | semmle.label | c |
178-
| main.rs:212:17:212:25 | source(...) | semmle.label | source(...) |
179-
| main.rs:213:14:213:14 | c | semmle.label | c |
147+
| main.rs:142:12:142:15 | SelfParam [MyInt] | semmle.label | SelfParam [MyInt] |
148+
| main.rs:142:42:145:5 | { ... } [MyInt] | semmle.label | { ... } [MyInt] |
149+
| main.rs:144:9:144:35 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] |
150+
| main.rs:144:24:144:27 | self [MyInt] | semmle.label | self [MyInt] |
151+
| main.rs:144:24:144:33 | self.value | semmle.label | self.value |
152+
| main.rs:159:9:159:9 | a [MyInt] | semmle.label | a [MyInt] |
153+
| main.rs:159:13:159:38 | MyInt {...} [MyInt] | semmle.label | MyInt {...} [MyInt] |
154+
| main.rs:159:28:159:36 | source(...) | semmle.label | source(...) |
155+
| main.rs:161:9:161:9 | d [MyInt] | semmle.label | d [MyInt] |
156+
| main.rs:161:13:161:20 | a.add(...) [MyInt] | semmle.label | a.add(...) [MyInt] |
157+
| main.rs:162:10:162:10 | d [MyInt] | semmle.label | d [MyInt] |
158+
| main.rs:162:10:162:16 | d.value | semmle.label | d.value |
159+
| main.rs:201:9:201:9 | a | semmle.label | a |
160+
| main.rs:201:13:201:21 | source(...) | semmle.label | source(...) |
161+
| main.rs:202:10:202:10 | a | semmle.label | a |
162+
| main.rs:211:13:211:13 | c | semmle.label | c |
163+
| main.rs:211:17:211:25 | source(...) | semmle.label | source(...) |
164+
| main.rs:212:14:212:14 | c | semmle.label | c |
180165
subpaths
181166
| main.rs:36:26:36:26 | a | main.rs:30:17:30:22 | ...: i64 | main.rs:30:32:32:1 | { ... } | main.rs:36:13:36:27 | pass_through(...) |
182167
| main.rs:41:26:44:5 | { ... } | main.rs:30:17:30:22 | ...: i64 | main.rs:30:32:32:1 | { ... } | main.rs:41:13:44:6 | pass_through(...) |
183168
| main.rs:55:26:55:26 | a | main.rs:51:21:51:26 | ...: i64 | main.rs:51:36:53:5 | { ... } | main.rs:55:13:55:27 | pass_through(...) |
184169
| main.rs:103:29:103:29 | a | main.rs:79:27:79:32 | ...: i64 | main.rs:79:42:85:5 | { ... } | main.rs:103:13:103:30 | mn.data_through(...) |
185170
| main.rs:116:38:116:38 | a | main.rs:79:27:79:32 | ...: i64 | main.rs:79:42:85:5 | { ... } | main.rs:116:13:116:39 | ...::data_through(...) |
186171
| main.rs:134:24:134:33 | source(...) | main.rs:128:12:128:17 | ...: i64 | main.rs:128:28:130:5 | { ... } [MyInt] | main.rs:134:13:134:34 | ...::new(...) [MyInt] |
187-
| main.rs:187:49:187:49 | a [MyInt] | main.rs:175:18:175:21 | SelfParam [MyInt] | main.rs:175:48:177:5 | { ... } [MyInt] | main.rs:187:30:187:53 | ...::take_self(...) [MyInt] |
188-
| main.rs:192:54:192:54 | b [MyInt] | main.rs:179:26:179:37 | ...: MyInt [MyInt] | main.rs:179:49:181:5 | { ... } [MyInt] | main.rs:192:30:192:55 | ...::take_second(...) [MyInt] |
172+
| main.rs:159:9:159:9 | a [MyInt] | main.rs:142:12:142:15 | SelfParam [MyInt] | main.rs:142:42:145:5 | { ... } [MyInt] | main.rs:161:13:161:20 | a.add(...) [MyInt] |
189173
testFailures
190174
#select
191175
| main.rs:18:10:18:10 | a | main.rs:13:5:13:13 | source(...) | main.rs:18:10:18:10 | a | $@ | main.rs:13:5:13:13 | source(...) | source(...) |
@@ -199,7 +183,6 @@ testFailures
199183
| main.rs:104:10:104:10 | b | main.rs:102:13:102:21 | source(...) | main.rs:104:10:104:10 | b | $@ | main.rs:102:13:102:21 | source(...) | source(...) |
200184
| main.rs:117:10:117:10 | b | main.rs:115:13:115:22 | source(...) | main.rs:117:10:117:10 | b | $@ | main.rs:115:13:115:22 | source(...) | source(...) |
201185
| main.rs:136:10:136:10 | m | main.rs:134:24:134:33 | source(...) | main.rs:136:10:136:10 | m | $@ | main.rs:134:24:134:33 | source(...) | source(...) |
202-
| main.rs:188:10:188:10 | c | main.rs:185:28:185:36 | source(...) | main.rs:188:10:188:10 | c | $@ | main.rs:185:28:185:36 | source(...) | source(...) |
203-
| main.rs:193:10:193:10 | c | main.rs:191:28:191:37 | source(...) | main.rs:193:10:193:10 | c | $@ | main.rs:191:28:191:37 | source(...) | source(...) |
204-
| main.rs:203:10:203:10 | a | main.rs:202:13:202:21 | source(...) | main.rs:203:10:203:10 | a | $@ | main.rs:202:13:202:21 | source(...) | source(...) |
205-
| main.rs:213:14:213:14 | c | main.rs:212:17:212:25 | source(...) | main.rs:213:14:213:14 | c | $@ | main.rs:212:17:212:25 | source(...) | source(...) |
186+
| main.rs:162:10:162:16 | d.value | main.rs:159:28:159:36 | source(...) | main.rs:162:10:162:16 | d.value | $@ | main.rs:159:28:159:36 | source(...) | source(...) |
187+
| main.rs:202:10:202:10 | a | main.rs:201:13:201:21 | source(...) | main.rs:202:10:202:10 | a | $@ | main.rs:201:13:201:21 | source(...) | source(...) |
188+
| main.rs:212:14:212:14 | c | main.rs:211:17:211:25 | source(...) | main.rs:212:14:212:14 | c | $@ | main.rs:211:17:211:25 | source(...) | source(...) |

rust/ql/test/library-tests/dataflow/global/main.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,7 @@ fn test_operator_overloading() {
159159
let a = MyInt { value: source(7) };
160160
let b = MyInt { value: 2 };
161161
let d = a.add(b);
162-
sink(d.value); // $ MISSING: hasValueFlow=7
163-
162+
sink(d.value); // $ hasValueFlow=7
164163
}
165164

166165
trait MyTrait {
@@ -185,12 +184,12 @@ fn data_through_trait_method_called_as_function() {
185184
let a = MyInt { value: source(8) };
186185
let b = MyInt { value: 2 };
187186
let MyInt { value: c } = MyTrait::take_self(a, b);
188-
sink(c); // $ hasValueFlow=8
187+
sink(c); // $ MISSING: hasValueFlow=8
189188

190189
let a = MyInt { value: 0 };
191190
let b = MyInt { value: source(37) };
192191
let MyInt { value: c } = MyTrait::take_second(a, b);
193-
sink(c); // $ hasValueFlow=37
192+
sink(c); // $ MISSING: hasValueFlow=37
194193

195194
let a = MyInt { value: 0 };
196195
let b = MyInt { value: source(38) };

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

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -37,31 +37,28 @@
3737
| main.rs:159:28:159:36 | source(...) | main.rs:1:1:3:1 | fn source |
3838
| main.rs:161:13:161:20 | a.add(...) | main.rs:142:5:145:5 | fn add |
3939
| main.rs:162:5:162:17 | sink(...) | main.rs:5:1:7:1 | fn sink |
40-
| main.rs:185:28:185:36 | source(...) | main.rs:1:1:3:1 | fn source |
41-
| main.rs:187:30:187:53 | ...::take_self(...) | main.rs:175:5:177:5 | fn take_self |
42-
| main.rs:188:5:188:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
43-
| main.rs:191:28:191:37 | source(...) | main.rs:1:1:3:1 | fn source |
44-
| main.rs:192:30:192:55 | ...::take_second(...) | main.rs:179:5:181:5 | fn take_second |
45-
| main.rs:193:5:193:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
46-
| main.rs:196:28:196:37 | source(...) | main.rs:1:1:3:1 | fn source |
47-
| main.rs:197:30:197:53 | ...::take_self(...) | main.rs:175:5:177:5 | fn take_self |
48-
| main.rs:198:5:198:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
49-
| main.rs:202:13:202:21 | source(...) | main.rs:1:1:3:1 | fn source |
50-
| main.rs:203:5:203:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
51-
| main.rs:208:13:208:26 | async_source(...) | main.rs:201:1:205:1 | fn async_source |
52-
| main.rs:209:5:209:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
53-
| main.rs:212:17:212:25 | source(...) | main.rs:1:1:3:1 | fn source |
54-
| main.rs:213:9:213:15 | sink(...) | main.rs:5:1:7:1 | fn sink |
55-
| main.rs:216:5:216:17 | sink(...) | main.rs:5:1:7:1 | fn sink |
56-
| main.rs:220:41:220:54 | async_source(...) | main.rs:201:1:205:1 | fn async_source |
57-
| main.rs:221:5:221:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
58-
| main.rs:223:33:223:61 | test_async_await_async_part(...) | main.rs:207:1:217:1 | fn test_async_await_async_part |
59-
| main.rs:227:5:227:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call |
60-
| main.rs:228:5:228:21 | data_in_to_call(...) | main.rs:25:1:28:1 | fn data_in_to_call |
61-
| main.rs:229:5:229:23 | data_through_call(...) | main.rs:34:1:38:1 | fn data_through_call |
62-
| main.rs:230:5:230:34 | data_through_nested_function(...) | main.rs:48:1:57:1 | fn data_through_nested_function |
63-
| main.rs:232:5:232:24 | data_out_of_method(...) | main.rs:88:1:92:1 | fn data_out_of_method |
64-
| main.rs:233:5:233:28 | data_in_to_method_call(...) | main.rs:94:1:98:1 | fn data_in_to_method_call |
65-
| main.rs:234:5:234:25 | data_through_method(...) | main.rs:100:1:105:1 | fn data_through_method |
66-
| main.rs:236:5:236:31 | test_operator_overloading(...) | main.rs:148:1:164:1 | fn test_operator_overloading |
67-
| main.rs:237:5:237:22 | test_async_await(...) | main.rs:219:1:224:1 | fn test_async_await |
40+
| main.rs:184:28:184:36 | source(...) | main.rs:1:1:3:1 | fn source |
41+
| main.rs:187:5:187:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
42+
| main.rs:190:28:190:37 | source(...) | main.rs:1:1:3:1 | fn source |
43+
| main.rs:192:5:192:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
44+
| main.rs:195:28:195:37 | source(...) | main.rs:1:1:3:1 | fn source |
45+
| main.rs:197:5:197:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
46+
| main.rs:201:13:201:21 | source(...) | main.rs:1:1:3:1 | fn source |
47+
| main.rs:202:5:202:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
48+
| main.rs:207:13:207:26 | async_source(...) | main.rs:200:1:204:1 | fn async_source |
49+
| main.rs:208:5:208:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
50+
| main.rs:211:17:211:25 | source(...) | main.rs:1:1:3:1 | fn source |
51+
| main.rs:212:9:212:15 | sink(...) | main.rs:5:1:7:1 | fn sink |
52+
| main.rs:215:5:215:17 | sink(...) | main.rs:5:1:7:1 | fn sink |
53+
| main.rs:219:41:219:54 | async_source(...) | main.rs:200:1:204:1 | fn async_source |
54+
| main.rs:220:5:220:11 | sink(...) | main.rs:5:1:7:1 | fn sink |
55+
| main.rs:222:33:222:61 | test_async_await_async_part(...) | main.rs:206:1:216:1 | fn test_async_await_async_part |
56+
| main.rs:226:5:226:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call |
57+
| main.rs:227:5:227:21 | data_in_to_call(...) | main.rs:25:1:28:1 | fn data_in_to_call |
58+
| main.rs:228:5:228:23 | data_through_call(...) | main.rs:34:1:38:1 | fn data_through_call |
59+
| main.rs:229:5:229:34 | data_through_nested_function(...) | main.rs:48:1:57:1 | fn data_through_nested_function |
60+
| main.rs:231:5:231:24 | data_out_of_method(...) | main.rs:88:1:92:1 | fn data_out_of_method |
61+
| main.rs:232:5:232:28 | data_in_to_method_call(...) | main.rs:94:1:98:1 | fn data_in_to_method_call |
62+
| main.rs:233:5:233:25 | data_through_method(...) | main.rs:100:1:105:1 | fn data_through_method |
63+
| main.rs:235:5:235:31 | test_operator_overloading(...) | main.rs:148:1:163:1 | fn test_operator_overloading |
64+
| main.rs:236:5:236:22 | test_async_await(...) | main.rs:218:1:223:1 | fn test_async_await |

0 commit comments

Comments
 (0)