Skip to content

Commit d1a1f57

Browse files
author
Benjamin Muskalla
committed
Convert taint-format test into inline test
1 parent 995a819 commit d1a1f57

File tree

3 files changed

+37
-60
lines changed

3 files changed

+37
-60
lines changed
Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,47 @@
11
import java.util.Formatter;
22
import java.lang.StringBuilder;
33

4-
5-
64
class A {
7-
public static String taint() { return "tainted"; }
5+
public static String taint() {
6+
return "tainted";
7+
}
88

99
public static void test1() {
10-
String bad = taint();
10+
String bad = taint(); // $ hasTaintFlow
1111
String good = "hi";
1212

13-
bad.formatted(good);
14-
good.formatted("a", bad, "b", good);
15-
String.format("%s%s", bad, good);
13+
bad.formatted(good); // $ hasTaintFlow
14+
good.formatted("a", bad, "b", good); // $ hasTaintFlow
15+
String.format("%s%s", bad, good); // $ hasTaintFlow
1616
String.format("%s", good);
17-
String.format("%s %s %s %s %s %s %s %s %s %s ", "a", "a", "a", "a", "a", "a", "a", "a", "a", bad);
17+
String.format("%s %s %s %s %s %s %s %s %s %s ", "a", "a", "a", "a", "a", "a", "a", "a", "a", bad); // $ hasTaintFlow
1818
}
1919

2020
public static void test2() {
21-
String bad = taint();
21+
String bad = taint(); // $ hasTaintFlow
2222
Formatter f = new Formatter();
2323

2424
f.toString();
25-
f.format("%s", bad);
26-
f.toString();
25+
f.format("%s", bad); // $ hasTaintFlow
26+
f.toString(); // $ hasTaintFlow
2727
}
2828

2929
public static void test3() {
30-
String bad = taint();
30+
String bad = taint(); // $ hasTaintFlow
3131
StringBuilder sb = new StringBuilder();
3232
Formatter f = new Formatter(sb);
3333

34-
sb.toString(); // false positive
35-
f.format("%s", bad);
36-
sb.toString();
34+
sb.toString(); // $ hasTaintFlow false positive
35+
f.format("%s", bad); // $ hasTaintFlow
36+
sb.toString(); // $ hasTaintFlow
3737
}
3838

3939
public static void test4() {
40-
String bad = taint();
40+
String bad = taint(); // $ hasTaintFlow
4141
StringBuilder sb = new StringBuilder();
4242

43-
sb.append(bad);
43+
sb.append(bad); // $ hasTaintFlow
4444

45-
new Formatter(sb).format("ok").toString();
45+
new Formatter(sb).format("ok").toString(); // $ hasTaintFlow
4646
}
4747
}
Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +0,0 @@
1-
| A.java:10:22:10:28 | taint(...) | A.java:10:22:10:28 | taint(...) |
2-
| A.java:10:22:10:28 | taint(...) | A.java:13:9:13:11 | bad |
3-
| A.java:10:22:10:28 | taint(...) | A.java:13:9:13:27 | formatted(...) |
4-
| A.java:10:22:10:28 | taint(...) | A.java:14:9:14:43 | formatted(...) |
5-
| A.java:10:22:10:28 | taint(...) | A.java:14:9:14:43 | new ..[] { .. } |
6-
| A.java:10:22:10:28 | taint(...) | A.java:14:29:14:31 | bad |
7-
| A.java:10:22:10:28 | taint(...) | A.java:15:9:15:40 | format(...) |
8-
| A.java:10:22:10:28 | taint(...) | A.java:15:9:15:40 | new ..[] { .. } |
9-
| A.java:10:22:10:28 | taint(...) | A.java:15:31:15:33 | bad |
10-
| A.java:10:22:10:28 | taint(...) | A.java:17:9:17:105 | format(...) |
11-
| A.java:10:22:10:28 | taint(...) | A.java:17:9:17:105 | new ..[] { .. } |
12-
| A.java:10:22:10:28 | taint(...) | A.java:17:102:17:104 | bad |
13-
| A.java:21:22:21:28 | taint(...) | A.java:21:22:21:28 | taint(...) |
14-
| A.java:21:22:21:28 | taint(...) | A.java:25:9:25:9 | f [post update] |
15-
| A.java:21:22:21:28 | taint(...) | A.java:25:9:25:27 | format(...) |
16-
| A.java:21:22:21:28 | taint(...) | A.java:25:9:25:27 | new ..[] { .. } |
17-
| A.java:21:22:21:28 | taint(...) | A.java:25:24:25:26 | bad |
18-
| A.java:21:22:21:28 | taint(...) | A.java:26:9:26:9 | f |
19-
| A.java:21:22:21:28 | taint(...) | A.java:26:9:26:20 | toString(...) |
20-
| A.java:30:22:30:28 | taint(...) | A.java:30:22:30:28 | taint(...) |
21-
| A.java:30:22:30:28 | taint(...) | A.java:34:9:34:10 | sb |
22-
| A.java:30:22:30:28 | taint(...) | A.java:34:9:34:21 | toString(...) |
23-
| A.java:30:22:30:28 | taint(...) | A.java:35:9:35:9 | f [post update] |
24-
| A.java:30:22:30:28 | taint(...) | A.java:35:9:35:27 | format(...) |
25-
| A.java:30:22:30:28 | taint(...) | A.java:35:9:35:27 | new ..[] { .. } |
26-
| A.java:30:22:30:28 | taint(...) | A.java:35:24:35:26 | bad |
27-
| A.java:30:22:30:28 | taint(...) | A.java:36:9:36:10 | sb |
28-
| A.java:30:22:30:28 | taint(...) | A.java:36:9:36:21 | toString(...) |
29-
| A.java:40:22:40:28 | taint(...) | A.java:40:22:40:28 | taint(...) |
30-
| A.java:40:22:40:28 | taint(...) | A.java:43:9:43:10 | sb [post update] |
31-
| A.java:40:22:40:28 | taint(...) | A.java:43:9:43:22 | append(...) |
32-
| A.java:40:22:40:28 | taint(...) | A.java:43:19:43:21 | bad |
33-
| A.java:40:22:40:28 | taint(...) | A.java:45:9:45:25 | new Formatter(...) |
34-
| A.java:40:22:40:28 | taint(...) | A.java:45:9:45:38 | format(...) |
35-
| A.java:40:22:40:28 | taint(...) | A.java:45:9:45:49 | toString(...) |
36-
| A.java:40:22:40:28 | taint(...) | A.java:45:23:45:24 | sb |
Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,29 @@
11
import java
2+
import semmle.code.java.dataflow.DataFlow
23
import semmle.code.java.dataflow.TaintTracking
4+
import TestUtilities.InlineExpectationsTest
35

4-
class Conf extends TaintTracking::Configuration {
5-
Conf() { this = "qltest:dataflow:format" }
6+
class TaintFlowConf extends TaintTracking::Configuration {
7+
TaintFlowConf() { this = "qltest:dataflow:format" }
68

79
override predicate isSource(DataFlow::Node n) {
810
n.asExpr().(MethodAccess).getMethod().hasName("taint")
911
}
1012

11-
override predicate isSink(DataFlow::Node n) { any() }
13+
override predicate isSink(DataFlow::Node n) { n instanceof DataFlow::ExprNode }
1214
}
1315

14-
from DataFlow::Node src, DataFlow::Node sink, Conf conf
15-
where conf.hasFlow(src, sink)
16-
select src, sink
16+
class HasFlowTest extends InlineExpectationsTest {
17+
HasFlowTest() { this = "HasFlowTest" }
18+
19+
override string getARelevantTag() { result = ["hasTaintFlow"] }
20+
21+
override predicate hasActualResult(Location location, string element, string tag, string value) {
22+
tag = "hasTaintFlow" and
23+
exists(DataFlow::Node src, DataFlow::Node sink, TaintFlowConf conf | conf.hasFlow(src, sink) |
24+
sink.getLocation() = location and
25+
element = sink.toString() and
26+
value = ""
27+
)
28+
}
29+
}

0 commit comments

Comments
 (0)