Skip to content

Commit c48586f

Browse files
author
Benjamin Muskalla
committed
Implement coverage tracking using dataflow nodes
1 parent 5b55a83 commit c48586f

File tree

1 file changed

+29
-7
lines changed

1 file changed

+29
-7
lines changed

java/ql/src/Telemetry/APIUsage.qll

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,48 @@
11
import java
22
private import semmle.code.java.dataflow.FlowSteps
33
private import semmle.code.java.dataflow.ExternalFlow
4+
private import semmle.code.java.dataflow.FlowSummary
5+
private import semmle.code.java.dataflow.DataFlow
6+
private import semmle.code.java.dataflow.TaintTracking
7+
private import semmle.code.java.dataflow.FlowSources
48

59
string supportKind(Callable api) {
610
if api instanceof TaintPreservingCallable
711
then result = "taint-preserving"
812
else
9-
if summaryModel(packageName(api), typeName(api), _, api.getName(), _, _, _, _, _)
13+
if summaryCall(api)
1014
then result = "summary"
1115
else
12-
if sinkModel(packageName(api), typeName(api), _, api.getName(), _, _, _, _)
16+
if sink(api)
1317
then result = "sink"
1418
else
15-
if sourceModel(packageName(api), typeName(api), _, api.getName(), _, _, _, _)
19+
if source(api)
1620
then result = "source"
1721
else result = "?"
1822
}
1923

20-
private string packageName(Callable api) {
21-
result = api.getCompilationUnit().getPackage().toString()
24+
predicate summaryCall(Callable api) {
25+
api instanceof SummarizedCallable
26+
or
27+
exists(Call call, DataFlow::Node arg |
28+
call.getCallee() = api and
29+
[call.getAnArgument(), call.getQualifier()] = arg.asExpr() and
30+
TaintTracking::localAdditionalTaintStep(arg, _)
31+
)
2232
}
2333

24-
private string typeName(Callable api) {
25-
result = api.getDeclaringType().getAnAncestor().getSourceDeclaration().toString()
34+
predicate sink(Callable api) {
35+
exists(Call call, DataFlow::Node arg |
36+
call.getCallee() = api and
37+
[call.getAnArgument(), call.getQualifier()] = arg.asExpr() and
38+
sinkNode(arg, _)
39+
)
40+
}
41+
42+
predicate source(Callable api) {
43+
exists(Call call, DataFlow::Node arg |
44+
call.getCallee() = api and
45+
[call.getAnArgument(), call.getQualifier()] = arg.asExpr() and
46+
arg instanceof RemoteFlowSource
47+
)
2648
}

0 commit comments

Comments
 (0)