Skip to content

Commit e9747ed

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

File tree

27 files changed

+229
-46
lines changed

27 files changed

+229
-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(...) |
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
multipleResolvedTargets
2+
| test.rs:419:34:419:35 | * ... |
3+
| test.rs:420:26:420:27 | * ... |
4+
| test.rs:597:9:597:10 | * ... |
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
multipleResolvedTargets
2+
| main.rs:236:11:236:15 | * ... |
3+
| main.rs:272:13:272:29 | * ... |
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
multipleResolvedTargets
2+
| main.rs:562:10:562:15 | * ... |
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
multipleResolvedTargets
2+
| main.rs:115:14:115:35 | * ... |
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
multipleResolvedTargets
2+
| main.rs:19:17:19:18 | * ... |
3+
| main.rs:53:14:53:15 | * ... |
4+
| main.rs:59:33:59:34 | * ... |
5+
| main.rs:72:14:72:15 | * ... |
6+
| main.rs:73:9:73:10 | * ... |
7+
| main.rs:74:14:74:15 | * ... |
8+
| main.rs:75:9:75:10 | * ... |
9+
| main.rs:76:14:76:15 | * ... |
10+
| main.rs:83:9:83:10 | * ... |
11+
| main.rs:90:9:90:17 | * ... |
12+
| main.rs:97:9:97:10 | * ... |
13+
| main.rs:105:9:105:10 | * ... |
14+
| main.rs:106:14:106:15 | * ... |
15+
| main.rs:113:14:113:15 | * ... |
16+
| main.rs:114:9:114:10 | * ... |
17+
| main.rs:115:14:115:15 | * ... |
18+
| main.rs:122:9:122:10 | * ... |
19+
| main.rs:125:9:125:10 | * ... |
20+
| main.rs:135:17:135:18 | * ... |
21+
| main.rs:136:17:136:18 | * ... |
22+
| main.rs:201:9:201:10 | * ... |
23+
| main.rs:209:14:209:15 | * ... |
24+
| main.rs:211:14:211:15 | * ... |
25+
| main.rs:224:13:224:17 | * ... |
26+
| main.rs:229:9:229:10 | * ... |

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(...) |

0 commit comments

Comments
 (0)