Skip to content

Commit 985f64d

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

File tree

3 files changed

+24
-31
lines changed

3 files changed

+24
-31
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

0 commit comments

Comments
 (0)