Skip to content

Commit e50f56c

Browse files
authored
Merge pull request github#12917 from egregius313/egregius313/java/dataflow/refactor-inline-flow-test
Java: Refactor `InlineFlowTest` to remove usage of `DataFlow::Configuration` API
2 parents 95b8a22 + d98723c commit e50f56c

File tree

6 files changed

+77
-73
lines changed

6 files changed

+77
-73
lines changed

java/ql/test/TestUtilities/InlineFlowTest.qll

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -61,37 +61,11 @@ private module DefaultValueFlow = DataFlow::Global<DefaultFlowConfig>;
6161

6262
private module DefaultTaintFlow = TaintTracking::Global<DefaultFlowConfig>;
6363

64-
class DefaultValueFlowConf extends DataFlow::Configuration {
65-
DefaultValueFlowConf() { this = "qltest:defaultValueFlowConf" }
66-
67-
override predicate isSource(DataFlow::Node n) { defaultSource(n) }
68-
69-
override predicate isSink(DataFlow::Node n) {
70-
exists(MethodAccess ma | ma.getMethod().hasName("sink") | n.asExpr() = ma.getAnArgument())
71-
}
72-
73-
override int fieldFlowBranchLimit() { result = 1000 }
74-
}
75-
76-
class DefaultTaintFlowConf extends TaintTracking::Configuration {
77-
DefaultTaintFlowConf() { this = "qltest:defaultTaintFlowConf" }
78-
79-
override predicate isSource(DataFlow::Node n) { defaultSource(n) }
80-
81-
override predicate isSink(DataFlow::Node n) {
82-
exists(MethodAccess ma | ma.getMethod().hasName("sink") | n.asExpr() = ma.getAnArgument())
83-
}
84-
85-
override int fieldFlowBranchLimit() { result = 1000 }
86-
}
87-
8864
private string getSourceArgString(DataFlow::Node src) {
8965
defaultSource(src) and
9066
src.asExpr().(MethodAccess).getAnArgument().(StringLiteral).getValue() = result
9167
}
9268

93-
abstract class EnableLegacyConfiguration extends Unit { }
94-
9569
class InlineFlowTest extends InlineExpectationsTest {
9670
InlineFlowTest() { this = "HasFlowTest" }
9771

@@ -116,18 +90,10 @@ class InlineFlowTest extends InlineExpectationsTest {
11690
}
11791

11892
predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) {
119-
if exists(EnableLegacyConfiguration e)
120-
then getValueFlowConfig().hasFlow(src, sink)
121-
else DefaultValueFlow::flow(src, sink)
93+
DefaultValueFlow::flow(src, sink)
12294
}
12395

12496
predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) {
125-
if exists(EnableLegacyConfiguration e)
126-
then getTaintFlowConfig().hasFlow(src, sink)
127-
else DefaultTaintFlow::flow(src, sink)
97+
DefaultTaintFlow::flow(src, sink)
12898
}
129-
130-
DataFlow::Configuration getValueFlowConfig() { result = any(DefaultValueFlowConf config) }
131-
132-
DataFlow::Configuration getTaintFlowConfig() { result = any(DefaultTaintFlowConf config) }
13399
}

java/ql/test/library-tests/frameworks/JaxWs/JaxRsFlow.ql

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,26 @@ import semmle.code.java.dataflow.TaintTracking
33
import semmle.code.java.dataflow.FlowSources
44
import TestUtilities.InlineFlowTest
55

6-
class EnableLegacy extends EnableLegacyConfiguration {
7-
EnableLegacy() { exists(this) }
8-
}
9-
10-
class TaintFlowConf extends DefaultTaintFlowConf {
11-
override predicate isSource(DataFlow::Node n) {
12-
super.isSource(n)
6+
module Config implements DataFlow::ConfigSig {
7+
predicate isSource(DataFlow::Node node) {
8+
DefaultFlowConfig::isSource(node)
139
or
14-
n instanceof RemoteFlowSource
10+
node instanceof RemoteFlowSource
1511
}
12+
13+
predicate isSink = DefaultFlowConfig::isSink/1;
1614
}
1715

18-
class ValueFlowConf extends DefaultValueFlowConf {
19-
override predicate isSource(DataFlow::Node n) {
20-
super.isSource(n)
21-
or
22-
n instanceof RemoteFlowSource
16+
module TaintFlow = TaintTracking::Global<Config>;
17+
18+
module ValueFlow = DataFlow::Global<Config>;
19+
20+
class Test extends InlineFlowTest {
21+
override predicate hasTaintFlow(DataFlow::Node source, DataFlow::Node sink) {
22+
TaintFlow::flow(source, sink)
23+
}
24+
25+
override predicate hasValueFlow(DataFlow::Node source, DataFlow::Node sink) {
26+
ValueFlow::flow(source, sink)
2327
}
2428
}
Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,37 @@
11
import java
2+
import semmle.code.java.dataflow.TaintTracking
23
import TestUtilities.InlineFlowTest
34
import semmle.code.java.dataflow.FlowSources
45

5-
class EnableLegacy extends EnableLegacyConfiguration {
6-
EnableLegacy() { exists(this) }
6+
module SliceValueFlowConfig implements DataFlow::ConfigSig {
7+
predicate isSource(DataFlow::Node source) {
8+
DefaultFlowConfig::isSource(source) or source instanceof RemoteFlowSource
9+
}
10+
11+
predicate isSink = DefaultFlowConfig::isSink/1;
712
}
813

9-
class SliceValueFlowConf extends DefaultValueFlowConf {
10-
override predicate isSource(DataFlow::Node source) {
11-
super.isSource(source) or source instanceof RemoteFlowSource
14+
module SliceValueFlow = DataFlow::Global<SliceValueFlowConfig>;
15+
16+
module SliceTaintFlowConfig implements DataFlow::ConfigSig {
17+
predicate isSource = DefaultFlowConfig::isSource/1;
18+
19+
predicate isSink = DefaultFlowConfig::isSink/1;
20+
21+
predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
22+
DefaultFlowConfig::isSink(node) and
23+
c.(DataFlow::SyntheticFieldContent).getField() = "androidx.slice.Slice.action"
1224
}
1325
}
1426

15-
class SliceTaintFlowConf extends DefaultTaintFlowConf {
16-
override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet c) {
17-
super.allowImplicitRead(node, c)
18-
or
19-
isSink(node) and
20-
c.(DataFlow::SyntheticFieldContent).getField() = "androidx.slice.Slice.action"
27+
module SliceTaintFlow = TaintTracking::Global<SliceTaintFlowConfig>;
28+
29+
class SliceFlowTest extends InlineFlowTest {
30+
override predicate hasValueFlow(DataFlow::Node source, DataFlow::Node sink) {
31+
SliceValueFlow::flow(source, sink)
32+
}
33+
34+
override predicate hasTaintFlow(DataFlow::Node source, DataFlow::Node sink) {
35+
SliceTaintFlow::flow(source, sink)
2136
}
2237
}
Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
import java
2+
import semmle.code.java.dataflow.DataFlow
23
import semmle.code.java.dataflow.FlowSources
34
import TestUtilities.InlineFlowTest
45

5-
class Conf extends DefaultTaintFlowConf {
6-
override predicate isSource(DataFlow::Node node) {
7-
super.isSource(node)
6+
module Config implements DataFlow::ConfigSig {
7+
predicate isSource(DataFlow::Node node) {
8+
DefaultFlowConfig::isSource(node)
89
or
910
node instanceof RemoteFlowSource
1011
}
12+
13+
predicate isSink = DefaultFlowConfig::isSink/1;
1114
}
1215

13-
class LegacyConfig extends EnableLegacyConfiguration {
14-
LegacyConfig() { this instanceof Unit }
16+
module Flow = TaintTracking::Global<Config>;
17+
18+
class Test extends InlineFlowTest {
19+
override predicate hasTaintFlow(DataFlow::Node source, DataFlow::Node sink) {
20+
Flow::flow(source, sink)
21+
}
1522
}
Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
import java
2+
import semmle.code.java.dataflow.DataFlow
23
import TestUtilities.InlineFlowTest
34

4-
class EnableLegacy extends EnableLegacyConfiguration {
5-
EnableLegacy() { exists(this) }
5+
module OkHttpFlowConfig implements DataFlow::ConfigSig {
6+
predicate isSource = DefaultFlowConfig::isSource/1;
7+
8+
predicate isSink(DataFlow::Node n) { DefaultFlowConfig::isSink(n) or sinkNode(n, "open-url") }
69
}
710

8-
class FlowConf extends DefaultValueFlowConf {
9-
override predicate isSink(DataFlow::Node n) { super.isSink(n) or sinkNode(n, "open-url") }
11+
module OkHttpFlow = DataFlow::Global<OkHttpFlowConfig>;
12+
13+
class OkHttpTest extends InlineFlowTest {
14+
override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) {
15+
OkHttpFlow::flow(src, sink)
16+
}
1017
}
Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
import java
2+
import semmle.code.java.dataflow.DataFlow
23
import TestUtilities.InlineFlowTest
34

4-
class EnableLegacy extends EnableLegacyConfiguration {
5-
EnableLegacy() { exists(this) }
5+
module FlowConfig implements DataFlow::ConfigSig {
6+
predicate isSource = DefaultFlowConfig::isSource/1;
7+
8+
predicate isSink(DataFlow::Node n) { DefaultFlowConfig::isSink(n) or sinkNode(n, "open-url") }
69
}
710

8-
class FlowConf extends DefaultValueFlowConf {
9-
override predicate isSink(DataFlow::Node n) { super.isSink(n) or sinkNode(n, "open-url") }
11+
module Flow = DataFlow::Global<FlowConfig>;
12+
13+
class RetrofitFlowTest extends InlineFlowTest {
14+
override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { Flow::flow(src, sink) }
1015
}

0 commit comments

Comments
 (0)