Skip to content

Commit 8aed72f

Browse files
committed
Rust: Include more calls in DB quality metrics
1 parent 7378fbc commit 8aed72f

File tree

18 files changed

+131
-46
lines changed

18 files changed

+131
-46
lines changed

rust/ql/consistency-queries/PathResolutionConsistency.ql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ class SourceLocatable extends Locatable {
1515
SourceLocatable() { this.fromSource() }
1616
}
1717

18-
query predicate multipleCallTargets(SourceLocatable a) {
19-
PathResolutionConsistency::multipleCallTargets(a, _)
18+
query predicate multipleResolvedTargets(SourceLocatable a) {
19+
PathResolutionConsistency::multipleResolvedTargets(a, _)
2020
}
2121

2222
query predicate multiplePathResolutions(SourceLocatable a) {

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

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,10 @@ query predicate multiplePathResolutions(Path p, ItemNode i) {
2424
strictcount(ItemNode i0 | i0 = resolvePath(p) and not i0 instanceof Crate) > 1
2525
}
2626

27-
// TODO: Take other calls into account
28-
abstract private class CallExprBase extends ArgsExpr { }
29-
30-
private class CallExprCallExprBase extends CallExpr, CallExprBase { }
31-
32-
private class MethodCallExprCallExprBase extends MethodCallExpr, CallExprBase { }
33-
34-
/** Holds if `call` has multiple static call targets including `target`. */
35-
query predicate multipleCallTargets(CallExprBase call, Callable target) {
36-
target = call.getResolvedTarget() and
37-
strictcount(call.getResolvedTarget()) > 1
27+
/** Holds if `ae` has multiple resolved targets including `target`. */
28+
query predicate multipleResolvedTargets(ArgsExpr ae, Addressable target) {
29+
target = ae.getResolvedTarget() and
30+
strictcount(ae.getResolvedTarget()) > 1
3831
}
3932

4033
/** Holds if `fe` resolves to multiple record fields including `field`. */
@@ -62,8 +55,8 @@ int getPathResolutionInconsistencyCounts(string type) {
6255
type = "Multiple path resolutions" and
6356
result = count(Path p | multiplePathResolutions(p, _) | p)
6457
or
65-
type = "Multiple static call targets" and
66-
result = count(CallExprBase call | multipleCallTargets(call, _) | call)
58+
type = "Multiple resolved targets" and
59+
result = count(ArgsExpr ae | multipleResolvedTargets(ae, _) | ae)
6760
or
6861
type = "Multiple record fields" and
6962
result = count(FieldExpr fe | multipleStructFields(fe, _) | fe)

rust/ql/src/queries/telemetry/DatabaseQuality.qll

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,25 @@ private class RelevantFile extends File {
1919
}
2020

2121
module CallTargetStats implements StatsSig {
22-
// TODO: Take other calls into account
23-
abstract private class CallExprBase extends ArgsExpr { }
24-
25-
private class CallExprCallExprBase extends CallExpr, CallExprBase { }
26-
27-
private class MethodCallExprCallExprBase extends MethodCallExpr, CallExprBase { }
28-
29-
int getNumberOfOk() {
30-
result =
31-
count(CallExprBase c | c.getFile() instanceof RelevantFile and exists(c.getResolvedTarget()))
22+
/**
23+
* A call-like expression that is relevant for call target statistics.
24+
*
25+
* Note that this also includes tuple struct instantiations and tuple
26+
* enum variant instantiations.
27+
*/
28+
private class RelevantArgsExpr extends ArgsExpr {
29+
RelevantArgsExpr() {
30+
this.getFile() instanceof RelevantFile and
31+
not this instanceof ClosureCallExpr and
32+
not this = any(Operation o | not o.isOverloaded(_, _, _))
33+
}
3234
}
3335

34-
additional predicate isNotOkCall(CallExprBase c) {
35-
c.getFile() instanceof RelevantFile and
36-
not exists(c.getResolvedTarget()) and
37-
not c instanceof ClosureCallExpr
38-
}
36+
int getNumberOfOk() { result = count(RelevantArgsExpr e | exists(e.getResolvedTarget())) }
37+
38+
additional predicate isNotOkCall(RelevantArgsExpr e) { not exists(e.getResolvedTarget()) }
3939

40-
int getNumberOfNotOk() { result = count(CallExprBase c | isNotOkCall(c)) }
40+
int getNumberOfNotOk() { result = count(RelevantArgsExpr e | isNotOkCall(e)) }
4141

4242
string getOkText() { result = "calls with call target" }
4343

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
multipleCallTargets
1+
multipleResolvedTargets
22
| proc_macro.rs:44:27:44:30 | ...::to_tokens(...) |

rust/ql/test/library-tests/dataflow/sources/net/CONSISTENCY/PathResolutionConsistency.expected

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
multipleCallTargets
1+
multipleResolvedTargets
22
| test.rs:59:62:59:77 | ...::from(...) |
33
| test.rs:66:58:66:73 | ...::from(...) |
44
| test.rs:389:30:389:67 | pinned.poll_read(...) |
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
multipleCallTargets
1+
multipleResolvedTargets
22
| main.rs:52:14:52:29 | ...::from(...) |

rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
multipleCallTargets
1+
multipleResolvedTargets
22
| main.rs:126:9:126:11 | f(...) |
33
| main.rs:366:9:368:16 | ...::f(...) |
44
| main.rs:369:9:371:16 | ...::f(...) |
Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,34 @@
1-
multipleCallTargets
1+
multipleResolvedTargets
2+
| blanket_impl.rs:33:13:33:17 | * ... |
23
| dereference.rs:69:15:69:24 | e1.deref() |
4+
| dereference.rs:73:15:73:17 | * ... |
5+
| dereference.rs:77:16:77:18 | * ... |
36
| dereference.rs:182:17:182:26 | ... .foo() |
47
| dereference.rs:183:17:183:23 | S.foo() |
58
| dereference.rs:184:17:184:30 | ... .foo() |
69
| dereference.rs:186:17:186:25 | S.bar(...) |
710
| dereference.rs:187:17:187:29 | S.bar(...) |
11+
| dyn_type.rs:65:20:65:23 | * ... |
12+
| dyn_type.rs:69:21:69:24 | * ... |
13+
| dyn_type.rs:90:10:90:13 | * ... |
14+
| invalid/main.rs:69:13:69:17 | * ... |
15+
| invalid/main.rs:76:13:76:17 | * ... |
16+
| main.rs:1077:14:1077:18 | * ... |
17+
| main.rs:1159:26:1159:30 | * ... |
18+
| main.rs:1504:14:1504:21 | * ... |
19+
| main.rs:1504:16:1504:20 | * ... |
20+
| main.rs:1509:14:1509:18 | * ... |
21+
| main.rs:1540:27:1540:29 | * ... |
22+
| main.rs:1654:17:1654:24 | * ... |
23+
| main.rs:1654:18:1654:24 | * ... |
24+
| main.rs:1792:17:1792:21 | * ... |
25+
| main.rs:1807:28:1807:32 | * ... |
26+
| main.rs:2440:13:2440:18 | * ... |
827
| main.rs:2634:13:2634:31 | ...::from(...) |
928
| main.rs:2635:13:2635:31 | ...::from(...) |
1029
| main.rs:2636:13:2636:31 | ...::from(...) |
1130
| main.rs:2642:13:2642:31 | ...::from(...) |
1231
| main.rs:2643:13:2643:31 | ...::from(...) |
1332
| main.rs:2644:13:2644:31 | ...::from(...) |
33+
| pattern_matching.rs:273:13:273:27 | * ... |
34+
| pattern_matching.rs:273:14:273:27 | * ... |
Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1-
multipleCallTargets
1+
multipleResolvedTargets
2+
| main.rs:16:15:16:16 | * ... |
23
| main.rs:91:19:91:40 | ...::from(...) |
34
| main.rs:113:19:113:40 | ...::from(...) |
5+
| main.rs:507:5:507:10 | * ... |
6+
| main.rs:512:5:512:6 | * ... |
7+
| main.rs:513:9:513:10 | * ... |
8+
| main.rs:514:9:514:10 | * ... |
9+
| main.rs:519:5:519:6 | * ... |
10+
| main.rs:520:9:520:10 | * ... |
11+
| main.rs:521:9:521:10 | * ... |
12+
| main.rs:522:5:522:6 | * ... |
13+
| main.rs:530:5:530:6 | * ... |
14+
| main.rs:542:5:542:7 | * ... |
15+
| main.rs:542:6:542:7 | * ... |
16+
| main.rs:552:5:552:6 | * ... |
17+
| main.rs:699:9:699:13 | * ... |
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
multipleCallTargets
1+
multipleResolvedTargets
22
| my_struct.rs:25:19:25:37 | ...::from(...) |

0 commit comments

Comments
 (0)