Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5fee6d2

Browse files
Convert Sets utilities
1 parent 10f0f30 commit 5fee6d2

2 files changed

Lines changed: 28 additions & 48 deletions

File tree

java/ql/lib/semmle/code/java/frameworks/guava/Collections.qll

Lines changed: 26 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -230,8 +230,32 @@ private class GuavaCollectCsv extends SummaryModelCsv {
230230
"com.google.common.collect;TreeBasedTable;true;create;(Table);;MapKey of Argument[0];MapKey of ReturnValue;value",
231231
"com.google.common.collect;TreeBasedTable;true;create;(Table);;MapValue of Argument[0];MapValue of ReturnValue;value",
232232
"com.google.common.collect;ArrayTable;true;create;(Iterable,Iterable);;Element of Argument[0];SyntheticField[com.google.common.collect.Table.rowKey] of MapKey of ReturnValue;value",
233-
"com.google.common.collect;ArrayTable;true;create;(Iterable,Iterable);;Element of Argument[1];SyntheticField[com.google.common.collect.Table.columnKey] of MapKey of ReturnValue;value"
234-
// Utility classes
233+
"com.google.common.collect;ArrayTable;true;create;(Iterable,Iterable);;Element of Argument[1];SyntheticField[com.google.common.collect.Table.columnKey] of MapKey of ReturnValue;value",
234+
// Utility classes (a few methods depending on lambda flow are not included)
235+
"com.google.common.collect;Sets$SetView;true;immutableCopy;();;Element of Argument[-1];Element of ReturnValue;value",
236+
"com.google.common.collect;Sets$SetView;true;copyInto;(Set);;Element of Argument[-1];Element of Argument[0];value",
237+
"com.google.common.collect;Sets;false;cartesanProduct;(List);;Element of Element of Argument[0];Element of Element of ReturnValue;value",
238+
"com.google.common.collect;Sets;false;cartesanProduct;(Set[]);;Element of ArrayElement of Argument[0];Element of Element of ReturnValue;value",
239+
"com.google.common.collect;Sets;false;combinations;(Set,int);;Element of Argument[0];Element of Element of ReturnValue;value",
240+
"com.google.common.collect;Sets;false;difference;(Set,Set);;Element of Argument[0];Element of ReturnValue;value",
241+
"com.google.common.collect;Sets;false;filter;(NavigableSet,Predicate);;Element of Argument[0];Element of ReturnValue;value",
242+
"com.google.common.collect;Sets;false;filter;(Set,Predicate);;Element of Argument[0];Element of ReturnValue;value",
243+
"com.google.common.collect;Sets;false;filter;(SortedSet,Predicate);;Element of Argument[0];Element of ReturnValue;value",
244+
"com.google.common.collect;Sets;false;newConcurrentHashSet;(Iterable);;Element of Argument[0];Element of ReturnValue;value",
245+
"com.google.common.collect;Sets;false;newCopyOnWriteArraySet;(Iterable);;Element of Argument[0];Element of ReturnValue;value",
246+
"com.google.common.collect;Sets;false;newConcurrentHashSet;(Iterable);;Element of Argument[0];Element of ReturnValue;value",
247+
"com.google.common.collect;Sets;false;newHashSet;(Iterable);;Element of Argument[0];Element of ReturnValue;value",
248+
"com.google.common.collect;Sets;false;newHashSet;(Iterator);;Element of Argument[0];Element of ReturnValue;value",
249+
"com.google.common.collect;Sets;false;newHashSet;(Object[]);;ArrayElement of Argument[0];Element of ReturnValue;value",
250+
"com.google.common.collect;Sets;false;newLinkedHashSet;(Iterable);;Element of Argument[0];Element of ReturnValue;value",
251+
"com.google.common.collect;Sets;false;newTreeSet;(Iterable);;Element of Argument[0];Element of ReturnValue;value",
252+
"com.google.common.collect;Sets;false;newSetFromMap;(Map);;MapKey of Argument[0];Element of ReturnValue;value",
253+
"com.google.common.collect;Sets;false;powerSet;(Set);;Element of Argument[0];Element of Element of ReturnValue;value",
254+
"com.google.common.collect;Sets;false;subSet;(NavigableSet,Range);;Element of Argument[0];Element of ReturnValue;value",
255+
"com.google.common.collect;Sets;false;symmetricDifference;(Set,Set);;Element of Argument[0..1]; Element of ReturnValue;value",
256+
"com.google.common.collect;Sets;false;union;(Set,Set);;Element of Argument[0..1];Element of ReturnValue;value",
257+
"com.google.common.collect;Sets;false;synchronizedNavigableSet;(NavigableSet);;Element of Argument[0];Element of ReturnValue;value",
258+
"com.google.common.collect;Sets;false;unmodifiableNavigableSet;(NavigableSet);;Element of Argument[0];Element of ReturnValue;value"
235259
]
236260
}
237261
}
@@ -308,47 +332,3 @@ private class TableColumnField extends SyntheticField {
308332
fieldType instanceof TypeObject
309333
}
310334
}
311-
312-
/**
313-
* A taint-preserving static method of `com.google.common.collect.Sets`.
314-
*/
315-
private class SetsMethod extends TaintPreservingCallable {
316-
int arg;
317-
318-
SetsMethod() {
319-
this.getDeclaringType().hasQualifiedName(guavaCollectPackage(), "Sets") and
320-
this.isStatic() and
321-
(
322-
// static <E> HashSet<E> newHashSet(E... elements)
323-
// static <E> Set<E> newConcurrentHashSet(Iterable<? extends E> elements)
324-
// static <E> CopyOnWriteArraySet<E> newCopyOnWriteArraySet(Iterable<? extends E> elements)
325-
// etc
326-
this.getName().matches("new%Set") and
327-
arg = 0
328-
or
329-
// static <B> Set<List<B>> cartesianProduct(List<? extends Set<? extends B>> sets)
330-
// static <B> Set<List<B>> cartesianProduct(Set<? extends B>... sets)
331-
// static <E> Set<Set<E>> combinations(Set<E> set, int size)
332-
// static <E> Sets.SetView<E> difference(Set<E> set1, Set<?> set2)
333-
// static <E> NavigableSet<E> filter(NavigableSet<E> unfiltered, Predicate<? super E> predicate)
334-
// static <E> Set<E> filter(Set<E> unfiltered, Predicate<? super E> predicate)
335-
// static <E> SortedSet<E> filter(SortedSet<E> unfiltered, Predicate<? super E> predicate)
336-
// static <E> Set<Set<E>> powerSet(Set<E> set)
337-
// static <K extends Comparable<? super K>> NavigableSet<K> subSet(NavigableSet<K> set, Range<K> range)
338-
// static <E> NavigableSet<E> synchronizedNavigableSet(NavigableSet<E> navigableSet)
339-
// static <E> NavigableSet<E> unmodifiableNavigableSet(NavigableSet<E> set)
340-
this.hasName([
341-
"cartesianProduct", "combinations", "difference", "filter", "powerSet", "subSet",
342-
"synchronizedNavigableSet", "unmodifyableNavigableSet"
343-
]) and
344-
arg = 0
345-
or
346-
// static <E> Sets.SetView<E> symmetricDifference(Set<? extends E> set1, Set<? extends E> set2)
347-
// static <E> Sets.SetView<E> union(Set<? extends E> set1, Set<? extends E> set2)
348-
this.hasName(["symmetricDifference", "union"]) and
349-
arg = [0, 1]
350-
)
351-
}
352-
353-
override predicate returnsTaintFrom(int arg_) { arg_ = arg }
354-
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ void test1() {
5151

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

54-
sink(element(Sets.filter(Sets.union(xs, ys), y -> true))); // $numTaintFlow=1
54+
sink(element(Sets.filter(Sets.union(xs, ys), y -> true))); // $numValueFlow=1
5555

56-
sink(element(Sets.newHashSet("a", "b", "c", "d", x))); // $numTaintFlow=1
56+
sink(element(Sets.newHashSet("a", "b", "c", "d", x))); // $numValueFlow=1
5757
}
5858

5959
void test2() {

0 commit comments

Comments
 (0)