Skip to content

Commit 56e611f

Browse files
Switch existing test cases to inline expectations
1 parent d67de88 commit 56e611f

File tree

4 files changed

+67
-106
lines changed

4 files changed

+67
-106
lines changed

java/ql/test/library-tests/frameworks/guava/TestCollect.java

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,20 @@ void test1() {
1414
String x = taint();
1515

1616
ImmutableSet<String> xs = ImmutableSet.of(x, "y", "z");
17-
sink(xs.asList());
17+
sink(xs.asList()); // $numTaintFlow=1
1818

1919
ImmutableSet<String> ys = ImmutableSet.of("a", "b", "c");
2020

21-
sink(Sets.filter(Sets.union(xs, ys), y -> true));
21+
sink(Sets.filter(Sets.union(xs, ys), y -> true)); // $numTaintFlow=1
2222

23-
sink(Sets.newHashSet("a", "b", "c", "d", x));
23+
sink(Sets.newHashSet("a", "b", "c", "d", x)); // $numTaintFlow=1
2424
}
2525

2626
void test2() {
27-
sink(ImmutableList.of(taint(), taint(), taint(), taint())); // expect 4 alerts
28-
sink(ImmutableMap.of(taint(), taint(), taint(), taint())); // expect 2 alerts
29-
sink(ImmutableMultimap.of(taint(), taint(), taint(), taint())); // expect 2 alerts
30-
sink(ImmutableTable.of(taint(),taint(), taint())); // expect 1 alert
27+
sink(ImmutableList.of(taint(), taint(), taint(), taint())); // $numTaintFlow=4
28+
sink(ImmutableMap.of(taint(), taint(), taint(), taint())); // $numTaintFlow=2
29+
sink(ImmutableMultimap.of(taint(), taint(), taint(), taint())); // $numTaintFlow=2
30+
sink(ImmutableTable.of(taint(),taint(), taint())); // $numTaintFlow=1
3131
}
3232

3333
void test3() {
@@ -38,20 +38,20 @@ void test3() {
3838
b.add("a");
3939
sink(b);
4040
b.add(x);
41-
sink(b.build());
41+
sink(b.build()); // $numTaintFlow=1
4242

4343
b = ImmutableList.builder();
4444

4545
b.add("a").add(x);
46-
sink(b.build());
46+
sink(b.build()); // $numTaintFlow=1
4747

48-
sink(ImmutableList.builder().add("a").add(x).build());
48+
sink(ImmutableList.builder().add("a").add(x).build()); // $numTaintFlow=1
4949

5050
ImmutableMap.Builder<String, String> b2 = ImmutableMap.builder();
5151
b2.put(x,"v");
5252
sink(b2);
5353
b2.put("k",x);
54-
sink(b2.build());
54+
sink(b2.build()); // $numTaintFlow=1
5555
}
5656

5757
void test4(Table<String, String, String> t1, Table<String, String, String> t2, Table<String, String, String> t3) {
@@ -61,62 +61,62 @@ void test4(Table<String, String, String> t1, Table<String, String, String> t2, T
6161
t1.put("r", x, "v");
6262
sink(t1);
6363
t1.put("r", "c", x);
64-
sink(t1);
65-
sink(t1.row("r"));
64+
sink(t1); // $numTaintFlow=1
65+
sink(t1.row("r")); // $numTaintFlow=1
6666

6767
t2.putAll(t1);
6868
for (Table.Cell<String,String,String> c : t2.cellSet()) {
69-
sink(c.getValue());
69+
sink(c.getValue()); // $numTaintFlow=1
7070
}
7171

72-
sink(t1.remove("r", "c"));
72+
sink(t1.remove("r", "c")); // $numTaintFlow=1
7373

7474
t3.row("r").put("c", x);
75-
sink(t3); // Not detected
75+
sink(t3); // MISSING:$numTaintFlow=1
7676
}
7777

7878
void test4(Multimap<String, String> m1, Multimap<String, String> m2, Multimap<String, String> m3,
7979
Multimap<String, String> m4, Multimap<String, String> m5){
8080
String x = taint();
8181
m1.put("k", x);
82-
sink(m1);
83-
sink(m1.get("k"));
82+
sink(m1); // $numTaintFlow=1
83+
sink(m1.get("k")); // $numTaintFlow=1
8484

8585
m2.putAll("k", ImmutableList.of("a", x, "b"));
86-
sink(m2);
86+
sink(m2); // $numTaintFlow=1
8787

8888
m3.putAll(m1);
89-
sink(m3);
89+
sink(m3); // $numTaintFlow=1
9090

9191
m4.replaceValues("k", m1.replaceValues("k", ImmutableList.of("a")));
9292
for (Map.Entry<String, String> e : m4.entries()) {
93-
sink(e.getValue());
93+
sink(e.getValue()); // $numTaintFlow=1
9494
}
9595

9696
m5.asMap().get("k").add(x);
97-
sink(m5); // Not detected
97+
sink(m5); // MISSING:$numTaintFlow=1
9898
}
9999

100100
void test5(Comparator<String> comp, SortedSet<String> sorS, SortedMap<String, String> sorM) {
101101
ImmutableSortedSet<String> s = ImmutableSortedSet.of(taint());
102102

103-
sink(s);
104-
sink(ImmutableSortedSet.copyOf(s));
105-
sink(ImmutableSortedSet.copyOf(comp, s));
103+
sink(s); // $numTaintFlow=1
104+
sink(ImmutableSortedSet.copyOf(s)); // $numTaintFlow=1
105+
sink(ImmutableSortedSet.copyOf(comp, s)); // $numTaintFlow=1
106106

107107
sorS.add(taint());
108-
sink(ImmutableSortedSet.copyOfSorted(sorS));
108+
sink(ImmutableSortedSet.copyOfSorted(sorS)); // $numTaintFlow=1
109109

110-
sink(ImmutableList.sortedCopyOf(s));
111-
sink(ImmutableList.sortedCopyOf(comp, s));
110+
sink(ImmutableList.sortedCopyOf(s)); // $numTaintFlow=1
111+
sink(ImmutableList.sortedCopyOf(comp, s)); // $numTaintFlow=1
112112

113113
ImmutableSortedMap<String, String> m = ImmutableSortedMap.of("k", taint());
114114

115-
sink(m);
116-
sink(ImmutableSortedMap.copyOf(m));
117-
sink(ImmutableSortedMap.copyOf(m, comp));
115+
sink(m); // $numTaintFlow=1
116+
sink(ImmutableSortedMap.copyOf(m)); // $numTaintFlow=1
117+
sink(ImmutableSortedMap.copyOf(m, comp)); // $numTaintFlow=1
118118

119119
sorM.put("k", taint());
120-
sink(ImmutableSortedMap.copyOfSorted(sorM));
120+
sink(ImmutableSortedMap.copyOfSorted(sorM)); // $numTaintFlow=1
121121
}
122122
}

java/ql/test/library-tests/frameworks/guava/TestStrings.java

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,25 @@ void sink(Object o) {}
1414
void test1() {
1515
String x = taint();
1616

17-
sink(Strings.padStart(x, 10, ' '));
18-
sink(Strings.padEnd(x, 10, ' '));
19-
sink(Strings.repeat(x, 3));
20-
sink(Strings.emptyToNull(Strings.nullToEmpty(x)));
21-
sink(Strings.lenientFormat(x, 3));
22-
sink(Strings.commonPrefix(x, "abc"));
23-
sink(Strings.commonSuffix(x, "cde"));
24-
sink(Strings.lenientFormat("%s = %s", x, 3));
17+
sink(Strings.padStart(x, 10, ' ')); // $numTaintFlow=1
18+
sink(Strings.padEnd(x, 10, ' ')); // $numTaintFlow=1
19+
sink(Strings.repeat(x, 3)); // $numTaintFlow=1
20+
sink(Strings.emptyToNull(Strings.nullToEmpty(x))); // $numTaintFlow=1
21+
sink(Strings.lenientFormat(x, 3)); // $numTaintFlow=1
22+
sink(Strings.commonPrefix(x, "abc"));
23+
sink(Strings.commonSuffix(x, "cde"));
24+
sink(Strings.lenientFormat("%s = %s", x, 3)); // $numTaintFlow=1
2525
}
2626

2727
void test2() {
2828
String x = taint();
2929
Splitter s = Splitter.on(x).omitEmptyStrings();
3030

3131
sink(s.split("x y z"));
32-
sink(s.split(x));
33-
sink(s.splitToList(x));
32+
sink(s.split(x)); // $numTaintFlow=1
33+
sink(s.splitToList(x)); // $numTaintFlow=1
3434
sink(s.withKeyValueSeparator("=").split("a=b"));
35-
sink(s.withKeyValueSeparator("=").split(x));
35+
sink(s.withKeyValueSeparator("=").split(x)); // $numTaintFlow=1
3636
}
3737

3838
void test3() {
@@ -43,20 +43,20 @@ void test3() {
4343
StringBuilder sb = new StringBuilder();
4444
sink(safeJoiner.appendTo(sb, "a", "b", "c"));
4545
sink(sb.toString());
46-
sink(taintedJoiner.appendTo(sb, "a", "b", "c"));
47-
sink(sb.toString());
48-
sink(safeJoiner.appendTo(sb, "a", "b", "c"));
49-
sink(sb.toString());
46+
sink(taintedJoiner.appendTo(sb, "a", "b", "c")); // $numTaintFlow=1
47+
sink(sb.toString()); // $numTaintFlow=1
48+
sink(safeJoiner.appendTo(sb, "a", "b", "c")); // $numTaintFlow=1
49+
sink(sb.toString()); // $numTaintFlow=1
5050

5151
sb = new StringBuilder();
52-
sink(safeJoiner.appendTo(sb, x, x));
52+
sink(safeJoiner.appendTo(sb, x, x)); // $numTaintFlow=1
5353

5454
Map<String, String> m = new HashMap<String, String>();
5555
m.put("k", "v");
5656
sink(safeJoiner.withKeyValueSeparator("=").join(m));
57-
sink(safeJoiner.withKeyValueSeparator(x).join(m));
58-
sink(taintedJoiner.useForNull("(null)").withKeyValueSeparator("=").join(m));
57+
sink(safeJoiner.withKeyValueSeparator(x).join(m)); // $numTaintFlow=1
58+
sink(taintedJoiner.useForNull("(null)").withKeyValueSeparator("=").join(m)); // $numTaintFlow=1
5959
m.put("k2", x);
60-
sink(safeJoiner.withKeyValueSeparator("=").join(m));
60+
sink(safeJoiner.withKeyValueSeparator("=").join(m)); // $numTaintFlow=1
6161
}
6262
}
Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +0,0 @@
1-
| TestCollect.java:14:20:14:26 | taint(...) | TestCollect.java:17:14:17:24 | asList(...) |
2-
| TestCollect.java:14:20:14:26 | taint(...) | TestCollect.java:21:14:21:55 | filter(...) |
3-
| TestCollect.java:14:20:14:26 | taint(...) | TestCollect.java:23:14:23:51 | newHashSet(...) |
4-
| TestCollect.java:27:31:27:37 | taint(...) | TestCollect.java:27:14:27:65 | of(...) |
5-
| TestCollect.java:27:40:27:46 | taint(...) | TestCollect.java:27:14:27:65 | of(...) |
6-
| TestCollect.java:27:49:27:55 | taint(...) | TestCollect.java:27:14:27:65 | of(...) |
7-
| TestCollect.java:27:58:27:64 | taint(...) | TestCollect.java:27:14:27:65 | of(...) |
8-
| TestCollect.java:28:39:28:45 | taint(...) | TestCollect.java:28:14:28:64 | of(...) |
9-
| TestCollect.java:28:57:28:63 | taint(...) | TestCollect.java:28:14:28:64 | of(...) |
10-
| TestCollect.java:29:44:29:50 | taint(...) | TestCollect.java:29:14:29:69 | of(...) |
11-
| TestCollect.java:29:62:29:68 | taint(...) | TestCollect.java:29:14:29:69 | of(...) |
12-
| TestCollect.java:30:49:30:55 | taint(...) | TestCollect.java:30:14:30:56 | of(...) |
13-
| TestCollect.java:34:20:34:26 | taint(...) | TestCollect.java:41:14:41:22 | build(...) |
14-
| TestCollect.java:34:20:34:26 | taint(...) | TestCollect.java:46:14:46:22 | build(...) |
15-
| TestCollect.java:34:20:34:26 | taint(...) | TestCollect.java:48:14:48:60 | build(...) |
16-
| TestCollect.java:34:20:34:26 | taint(...) | TestCollect.java:54:14:54:23 | build(...) |
17-
| TestCollect.java:58:20:58:26 | taint(...) | TestCollect.java:64:14:64:15 | t1 |
18-
| TestCollect.java:58:20:58:26 | taint(...) | TestCollect.java:65:14:65:24 | row(...) |
19-
| TestCollect.java:58:20:58:26 | taint(...) | TestCollect.java:69:18:69:29 | getValue(...) |
20-
| TestCollect.java:58:20:58:26 | taint(...) | TestCollect.java:72:14:72:32 | remove(...) |
21-
| TestCollect.java:80:20:80:26 | taint(...) | TestCollect.java:82:14:82:15 | m1 |
22-
| TestCollect.java:80:20:80:26 | taint(...) | TestCollect.java:83:14:83:24 | get(...) |
23-
| TestCollect.java:80:20:80:26 | taint(...) | TestCollect.java:86:14:86:15 | m2 |
24-
| TestCollect.java:80:20:80:26 | taint(...) | TestCollect.java:89:14:89:15 | m3 |
25-
| TestCollect.java:80:20:80:26 | taint(...) | TestCollect.java:93:18:93:29 | getValue(...) |
26-
| TestCollect.java:101:62:101:68 | taint(...) | TestCollect.java:103:14:103:14 | s |
27-
| TestCollect.java:101:62:101:68 | taint(...) | TestCollect.java:104:14:104:41 | copyOf(...) |
28-
| TestCollect.java:101:62:101:68 | taint(...) | TestCollect.java:105:14:105:47 | copyOf(...) |
29-
| TestCollect.java:101:62:101:68 | taint(...) | TestCollect.java:110:14:110:42 | sortedCopyOf(...) |
30-
| TestCollect.java:101:62:101:68 | taint(...) | TestCollect.java:111:14:111:48 | sortedCopyOf(...) |
31-
| TestCollect.java:107:18:107:24 | taint(...) | TestCollect.java:108:14:108:50 | copyOfSorted(...) |
32-
| TestCollect.java:113:75:113:81 | taint(...) | TestCollect.java:115:14:115:14 | m |
33-
| TestCollect.java:113:75:113:81 | taint(...) | TestCollect.java:116:14:116:41 | copyOf(...) |
34-
| TestCollect.java:113:75:113:81 | taint(...) | TestCollect.java:117:14:117:47 | copyOf(...) |
35-
| TestCollect.java:119:23:119:29 | taint(...) | TestCollect.java:120:14:120:50 | copyOfSorted(...) |
36-
| TestStrings.java:15:20:15:26 | taint(...) | TestStrings.java:17:14:17:41 | padStart(...) |
37-
| TestStrings.java:15:20:15:26 | taint(...) | TestStrings.java:18:14:18:39 | padEnd(...) |
38-
| TestStrings.java:15:20:15:26 | taint(...) | TestStrings.java:19:14:19:33 | repeat(...) |
39-
| TestStrings.java:15:20:15:26 | taint(...) | TestStrings.java:20:14:20:56 | emptyToNull(...) |
40-
| TestStrings.java:15:20:15:26 | taint(...) | TestStrings.java:21:14:21:40 | lenientFormat(...) |
41-
| TestStrings.java:15:20:15:26 | taint(...) | TestStrings.java:24:14:24:51 | lenientFormat(...) |
42-
| TestStrings.java:28:20:28:26 | taint(...) | TestStrings.java:32:14:32:23 | split(...) |
43-
| TestStrings.java:28:20:28:26 | taint(...) | TestStrings.java:33:14:33:29 | splitToList(...) |
44-
| TestStrings.java:28:20:28:26 | taint(...) | TestStrings.java:35:14:35:50 | split(...) |
45-
| TestStrings.java:39:20:39:26 | taint(...) | TestStrings.java:46:14:46:54 | appendTo(...) |
46-
| TestStrings.java:39:20:39:26 | taint(...) | TestStrings.java:47:14:47:26 | toString(...) |
47-
| TestStrings.java:39:20:39:26 | taint(...) | TestStrings.java:48:14:48:51 | appendTo(...) |
48-
| TestStrings.java:39:20:39:26 | taint(...) | TestStrings.java:49:14:49:26 | toString(...) |
49-
| TestStrings.java:39:20:39:26 | taint(...) | TestStrings.java:52:14:52:42 | appendTo(...) |
50-
| TestStrings.java:39:20:39:26 | taint(...) | TestStrings.java:57:14:57:56 | join(...) |
51-
| TestStrings.java:39:20:39:26 | taint(...) | TestStrings.java:58:14:58:82 | join(...) |
52-
| TestStrings.java:39:20:39:26 | taint(...) | TestStrings.java:60:14:60:58 | join(...) |

java/ql/test/library-tests/frameworks/guava/flow.ql

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import java
22
import semmle.code.java.dataflow.TaintTracking
3+
import TestUtilities.InlineExpectationsTest
34

45
class Conf extends TaintTracking::Configuration {
56
Conf() { this = "qltest:frameworks:guava" }
@@ -13,6 +14,18 @@ class Conf extends TaintTracking::Configuration {
1314
}
1415
}
1516

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

0 commit comments

Comments
 (0)