Skip to content

Commit 2894356

Browse files
committed
Rust: Include more calls in DB quality metrics
1 parent 8b89e15 commit 2894356

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 InvocationExpr { }
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(InvocationExpr ie, Addressable target) {
29+
target = ie.getResolvedTarget() and
30+
strictcount(ie.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(InvocationExpr ie | multipleResolvedTargets(ie, _) | ie)
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
@@ -20,25 +20,25 @@ private class RelevantFile extends File {
2020
}
2121

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

35-
additional predicate isNotOkCall(CallExprBase c) {
36-
c.getFile() instanceof RelevantFile and
37-
not exists(c.getResolvedTarget()) and
38-
not c instanceof CallExprImpl::DynamicCallExpr
39-
}
37+
int getNumberOfOk() { result = count(RelevantInvocationExpr e | exists(e.getResolvedTarget())) }
38+
39+
additional predicate isNotOkCall(RelevantInvocationExpr e) { not exists(e.getResolvedTarget()) }
4040

41-
int getNumberOfNotOk() { result = count(CallExprBase c | isNotOkCall(c)) }
41+
int getNumberOfNotOk() { result = count(RelevantInvocationExpr e | isNotOkCall(e)) }
4242

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

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)