Skip to content

Commit 2b892bc

Browse files
authored
Merge pull request #9553 from michaelnebel/csharp/narrowtelemetry
C#/Java: Only display 1k most relevant results for ExternalApi telemetry queries.
2 parents 9fe238f + dc02a6e commit 2b892bc

12 files changed

+136
-24
lines changed

csharp/ql/src/Telemetry/ExternalApi.qll

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,36 @@ class ExternalApi extends DotNet::Callable {
107107
/** Holds if this API is supported by existing CodeQL libraries, that is, it is either a recognized source or sink or has a flow summary. */
108108
predicate isSupported() { this.hasSummary() or this.isSource() or this.isSink() }
109109
}
110+
111+
/**
112+
* Gets the limit for the number of results produced by a telemetry query.
113+
*/
114+
int resultLimit() { result = 1000 }
115+
116+
/**
117+
* Holds if the relevant usage count of `api` is `usages`.
118+
*/
119+
signature predicate relevantUsagesSig(ExternalApi api, int usages);
120+
121+
/**
122+
* Given a predicate to count relevant API usages, this module provides a predicate
123+
* for restricting the number or returned results based on a certain limit.
124+
*/
125+
module Results<relevantUsagesSig/2 getRelevantUsages> {
126+
private int getOrder(ExternalApi api) {
127+
api =
128+
rank[result](ExternalApi a, int usages |
129+
getRelevantUsages(a, usages)
130+
|
131+
a order by usages desc, a.getInfo()
132+
)
133+
}
134+
135+
/**
136+
* Holds if `api` is being used `usages` times and if it is
137+
* in the top results (guarded by resultLimit).
138+
*/
139+
predicate restrict(ExternalApi api, int usages) {
140+
getRelevantUsages(api, usages) and getOrder(api) <= resultLimit()
141+
}
142+
}

csharp/ql/src/Telemetry/ExternalLibraryUsage.ql

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,23 @@ private import csharp
1010
private import semmle.code.csharp.dispatch.Dispatch
1111
private import ExternalApi
1212

13-
from int usages, string info
14-
where
13+
private predicate getRelevantUsages(string info, int usages) {
1514
usages =
1615
strictcount(DispatchCall c, ExternalApi api |
1716
c = api.getACall() and
1817
api.getInfoPrefix() = info and
1918
not api.isUninteresting()
2019
)
20+
}
21+
22+
private int getOrder(string info) {
23+
info =
24+
rank[result](string i, int usages | getRelevantUsages(i, usages) | i order by usages desc, i)
25+
}
26+
27+
from ExternalApi api, string info, int usages
28+
where
29+
info = api.getInfoPrefix() and
30+
getRelevantUsages(info, usages) and
31+
getOrder(info) <= resultLimit()
2132
select info, usages order by usages desc

csharp/ql/src/Telemetry/SupportedExternalSinks.ql

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@ private import csharp
1010
private import semmle.code.csharp.dispatch.Dispatch
1111
private import ExternalApi
1212

13-
from ExternalApi api, int usages
14-
where
13+
private predicate getRelevantUsages(ExternalApi api, int usages) {
1514
not api.isUninteresting() and
1615
api.isSink() and
1716
usages = strictcount(DispatchCall c | c = api.getACall())
17+
}
18+
19+
from ExternalApi api, int usages
20+
where Results<getRelevantUsages/2>::restrict(api, usages)
1821
select api.getInfo() as info, usages order by usages desc

csharp/ql/src/Telemetry/SupportedExternalSources.ql

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@ private import csharp
1010
private import semmle.code.csharp.dispatch.Dispatch
1111
private import ExternalApi
1212

13-
from ExternalApi api, int usages
14-
where
13+
private predicate getRelevantUsages(ExternalApi api, int usages) {
1514
not api.isUninteresting() and
1615
api.isSource() and
1716
usages = strictcount(DispatchCall c | c = api.getACall())
17+
}
18+
19+
from ExternalApi api, int usages
20+
where Results<getRelevantUsages/2>::restrict(api, usages)
1821
select api.getInfo() as info, usages order by usages desc

csharp/ql/src/Telemetry/SupportedExternalTaint.ql

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@ private import csharp
1010
private import semmle.code.csharp.dispatch.Dispatch
1111
private import ExternalApi
1212

13-
from ExternalApi api, int usages
14-
where
13+
private predicate getRelevantUsages(ExternalApi api, int usages) {
1514
not api.isUninteresting() and
1615
api.hasSummary() and
1716
usages = strictcount(DispatchCall c | c = api.getACall())
17+
}
18+
19+
from ExternalApi api, int usages
20+
where Results<getRelevantUsages/2>::restrict(api, usages)
1821
select api.getInfo() as info, usages order by usages desc

csharp/ql/src/Telemetry/UnsupportedExternalAPIs.ql

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@ private import csharp
1010
private import semmle.code.csharp.dispatch.Dispatch
1111
private import ExternalApi
1212

13-
from ExternalApi api, int usages
14-
where
13+
private predicate getRelevantUsages(ExternalApi api, int usages) {
1514
not api.isUninteresting() and
1615
not api.isSupported() and
1716
usages = strictcount(DispatchCall c | c = api.getACall())
17+
}
18+
19+
from ExternalApi api, int usages
20+
where Results<getRelevantUsages/2>::restrict(api, usages)
1821
select api.getInfo() as info, usages order by usages desc

java/ql/src/Telemetry/ExternalApi.qll

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,36 @@ class ExternalApi extends Callable {
9898

9999
/** DEPRECATED: Alias for ExternalApi */
100100
deprecated class ExternalAPI = ExternalApi;
101+
102+
/**
103+
* Gets the limit for the number of results produced by a telemetry query.
104+
*/
105+
int resultLimit() { result = 1000 }
106+
107+
/**
108+
* Holds if the relevant usage count of `api` is `usages`.
109+
*/
110+
signature predicate relevantUsagesSig(ExternalApi api, int usages);
111+
112+
/**
113+
* Given a predicate to count relevant API usages, this module provides a predicate
114+
* for restricting the number or returned results based on a certain limit.
115+
*/
116+
module Results<relevantUsagesSig/2 getRelevantUsages> {
117+
private int getOrder(ExternalApi api) {
118+
api =
119+
rank[result](ExternalApi a, int usages |
120+
getRelevantUsages(a, usages)
121+
|
122+
a order by usages desc, a.getApiName()
123+
)
124+
}
125+
126+
/**
127+
* Holds if `api` is being used `usages` times and if it is
128+
* in the top results (guarded by resultLimit).
129+
*/
130+
predicate restrict(ExternalApi api, int usages) {
131+
getRelevantUsages(api, usages) and getOrder(api) <= resultLimit()
132+
}
133+
}

java/ql/src/Telemetry/ExternalLibraryUsage.ql

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,28 @@
99
import java
1010
import ExternalApi
1111

12-
from int usages, string jarname
13-
where
12+
private predicate getRelevantUsages(string jarname, int usages) {
1413
usages =
1514
strictcount(Call c, ExternalApi a |
1615
c.getCallee().getSourceDeclaration() = a and
1716
not c.getFile() instanceof GeneratedFile and
1817
a.jarContainer() = jarname and
1918
not a.isUninteresting()
2019
)
20+
}
21+
22+
private int getOrder(string jarname) {
23+
jarname =
24+
rank[result](string jar, int usages |
25+
getRelevantUsages(jar, usages)
26+
|
27+
jar order by usages desc, jar
28+
)
29+
}
30+
31+
from ExternalApi api, string jarname, int usages
32+
where
33+
jarname = api.jarContainer() and
34+
getRelevantUsages(jarname, usages) and
35+
getOrder(jarname) <= resultLimit()
2136
select jarname, usages order by usages desc

java/ql/src/Telemetry/SupportedExternalSinks.ql

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,17 @@
88

99
import java
1010
import ExternalApi
11-
import semmle.code.java.GeneratedFiles
1211

13-
from ExternalApi api, int usages
14-
where
12+
private predicate getRelevantUsages(ExternalApi api, int usages) {
1513
not api.isUninteresting() and
1614
api.isSink() and
1715
usages =
1816
strictcount(Call c |
1917
c.getCallee().getSourceDeclaration() = api and
2018
not c.getFile() instanceof GeneratedFile
2119
)
20+
}
21+
22+
from ExternalApi api, int usages
23+
where Results<getRelevantUsages/2>::restrict(api, usages)
2224
select api.getApiName() as apiname, usages order by usages desc

java/ql/src/Telemetry/SupportedExternalSources.ql

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,17 @@
88

99
import java
1010
import ExternalApi
11-
import semmle.code.java.GeneratedFiles
1211

13-
from ExternalApi api, int usages
14-
where
12+
private predicate getRelevantUsages(ExternalApi api, int usages) {
1513
not api.isUninteresting() and
1614
api.isSource() and
1715
usages =
1816
strictcount(Call c |
1917
c.getCallee().getSourceDeclaration() = api and
2018
not c.getFile() instanceof GeneratedFile
2119
)
20+
}
21+
22+
from ExternalApi api, int usages
23+
where Results<getRelevantUsages/2>::restrict(api, usages)
2224
select api.getApiName() as apiname, usages order by usages desc

0 commit comments

Comments
 (0)