Skip to content

Commit 5d55265

Browse files
committed
Add telemetry for untyped expressions and missing call targets
1 parent 1fd459e commit 5d55265

File tree

1 file changed

+68
-1
lines changed

1 file changed

+68
-1
lines changed

java/ql/src/Telemetry/ExtractorInformation.ql

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,67 @@ predicate extractorTotalDiagnostics(string key, int value) {
8585
)
8686
}
8787

88+
signature module StatsSig {
89+
int getNumberOfOk();
90+
91+
int getNumberOfNotOk();
92+
93+
string getOkText();
94+
95+
string getNotOkText();
96+
}
97+
98+
module ReportStats<StatsSig Stats> {
99+
predicate numberOfOk(string key, int value) {
100+
value = Stats::getNumberOfOk() and
101+
key = "Number of " + Stats::getOkText()
102+
}
103+
104+
predicate numberOfNotOk(string key, int value) {
105+
value = Stats::getNumberOfNotOk() and
106+
key = "Number of " + Stats::getNotOkText()
107+
}
108+
109+
predicate percentageOfOk(string key, float value) {
110+
value = Stats::getNumberOfOk() * 100.0 / (Stats::getNumberOfOk() + Stats::getNumberOfNotOk()) and
111+
key = "Percentage of " + Stats::getOkText()
112+
}
113+
}
114+
115+
module CallTargetStats implements StatsSig {
116+
int getNumberOfOk() { result = count(Call c | exists(c.getCallee())) }
117+
118+
int getNumberOfNotOk() { result = count(Call c | not exists(c.getCallee())) }
119+
120+
string getOkText() { result = "calls with call target" }
121+
122+
string getNotOkText() { result = "calls with missing call target" }
123+
}
124+
125+
private class SourceExpr extends Expr {
126+
SourceExpr() {
127+
this.getFile().isSourceFile()
128+
}
129+
}
130+
131+
private predicate hasGoodType(Expr e) {
132+
exists(e.getType()) and not e.getType() instanceof ErrorType
133+
}
134+
135+
module ExprTypeStats implements StatsSig {
136+
int getNumberOfOk() { result = count(SourceExpr e | hasGoodType(e)) }
137+
138+
int getNumberOfNotOk() { result = count(SourceExpr e | not hasGoodType(e)) }
139+
140+
string getOkText() { result = "expressions with known type" }
141+
142+
string getNotOkText() { result = "expressions with unknown type" }
143+
}
144+
145+
module CallTargetStatsReport = ReportStats<CallTargetStats>;
146+
147+
module ExprTypeStatsReport = ReportStats<ExprTypeStats>;
148+
88149
from string key, int value
89150
where
90151
not exists(string pattern | extractorInformationSkipKey(pattern) and key.matches(pattern)) and
@@ -97,6 +158,12 @@ where
97158
totalNumberOfLinesByExtension(key, value) or
98159
numberOfLinesOfCodeByExtension(key, value) or
99160
extractorDiagnostics(key, value) or
100-
extractorTotalDiagnostics(key, value)
161+
extractorTotalDiagnostics(key, value) or
162+
CallTargetStatsReport::numberOfOk(key, value) or
163+
CallTargetStatsReport::numberOfNotOk(key, value) or
164+
CallTargetStatsReport::percentageOfOk(key, value) or
165+
ExprTypeStatsReport::numberOfOk(key, value) or
166+
ExprTypeStatsReport::numberOfNotOk(key, value) or
167+
ExprTypeStatsReport::percentageOfOk(key, value)
101168
)
102169
select key, value

0 commit comments

Comments
 (0)