C#: Add a parameterized module for a telemetry result ordering predicate (will be needed to narrow the number of produced results).

This commit is contained in:
Michael Nebel
2022-06-14 14:22:14 +02:00
parent f7cc46b84b
commit d5eebc8405

View File

@@ -107,3 +107,32 @@ class ExternalApi extends DotNet::Callable {
/** 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. */
predicate isSupported() { this.hasSummary() or this.isSource() or this.isSink() }
}
/**
* A limit for the number of results produced by a telemetry query.
*/
int resultLimit() { result = 1000 }
/**
* A predicate signature for relevant usage counts of an External API `api`.
*/
signature predicate relevantUsagesSig(ExternalApi api, int usages);
/**
* Given a predicate to count relevant API usages, this module provides a predicate
* for restricting the number or returned results based on a certain limit.
*/
module Results<relevantUsagesSig/2 getRelevantUsages> {
private int getOrder(ExternalApi api) {
api =
rank[result](ExternalApi a, int usages |
getRelevantUsages(a, usages)
|
a order by usages desc, a.getInfo()
)
}
predicate restrict(ExternalApi api, int usages) {
getRelevantUsages(api, usages) and getOrder(api) <= resultLimit()
}
}