Skip to content

Commit e88bbfd

Browse files
authored
Merge pull request #7008 from JLLeitschuh/feat/JLL/java_optional_lambda_support
Java: Model java.util.Optional lambda methods
2 parents 64acd02 + b59f666 commit e88bbfd

File tree

3 files changed

+69
-0
lines changed

3 files changed

+69
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
lgtm,codescanning
2+
* Added data flow models for lambda methods on `java.util.Optional`.

java/ql/lib/semmle/code/java/frameworks/Optional.qll

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,22 @@ private class OptionalModel extends SummaryModelCsv {
77
s =
88
[
99
"java.util;Optional;false;filter;;;Element of Argument[-1];Element of ReturnValue;value",
10+
"java.util;Optional;false;filter;;;Element of Argument[-1];Parameter[0] of Argument[0];value",
11+
"java.util;Optional;false;flatMap;;;Element of Argument[-1];Parameter[0] of Argument[0];value",
12+
"java.util;Optional;false;flatMap;;;ReturnValue of Argument[0];ReturnValue;value",
1013
"java.util;Optional;false;get;;;Element of Argument[-1];ReturnValue;value",
14+
"java.util;Optional;false;ifPresent;;;Element of Argument[-1];Parameter[0] of Argument[0];value",
15+
"java.util;Optional;false;ifPresentOrElse;;;Element of Argument[-1];Parameter[0] of Argument[0];value",
16+
"java.util;Optional;false;map;;;Element of Argument[-1];Parameter[0] of Argument[0];value",
17+
"java.util;Optional;false;map;;;ReturnValue of Argument[0];Element of ReturnValue;value",
1118
"java.util;Optional;false;of;;;Argument[0];Element of ReturnValue;value",
1219
"java.util;Optional;false;ofNullable;;;Argument[0];Element of ReturnValue;value",
1320
"java.util;Optional;false;or;;;Element of Argument[-1];Element of ReturnValue;value",
21+
"java.util;Optional;false;or;;;ReturnValue of Argument[0];ReturnValue;value",
1422
"java.util;Optional;false;orElse;;;Element of Argument[-1];ReturnValue;value",
1523
"java.util;Optional;false;orElse;;;Argument[0];ReturnValue;value",
1624
"java.util;Optional;false;orElseGet;;;Element of Argument[-1];ReturnValue;value",
25+
"java.util;Optional;false;orElseGet;;;ReturnValue of Argument[0];ReturnValue;value",
1726
"java.util;Optional;false;orElseThrow;;;Element of Argument[-1];ReturnValue;value",
1827
"java.util;Optional;false;stream;;;Element of Argument[-1];Element of ReturnValue;value"
1928
]
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import java.util.Optional;
2+
3+
public class FunctionalTest {
4+
String source() {
5+
return null;
6+
}
7+
8+
void sink(Object o) {
9+
}
10+
11+
void test() {
12+
Optional<String> o = Optional.of(source());
13+
o.ifPresent(v -> {
14+
sink(v); // $hasValueFlow
15+
});
16+
o.ifPresentOrElse(v -> {
17+
sink(v); // $hasValueFlow
18+
}, () -> {
19+
// no-op
20+
});
21+
o.map(v -> {
22+
sink(v); // $hasValueFlow
23+
return v;
24+
}).ifPresent(v -> {
25+
sink(v); // $hasValueFlow
26+
});
27+
o.flatMap(v -> {
28+
sink(v); // $hasValueFlow
29+
return Optional.of(v);
30+
}).ifPresent(v -> {
31+
sink(v); // $hasValueFlow
32+
});
33+
o.flatMap(v -> {
34+
sink(v); // $hasValueFlow
35+
return Optional.of("safe");
36+
}).ifPresent(v -> {
37+
sink(v); // no value flow
38+
});
39+
o.filter(v -> {
40+
sink(v); // $hasValueFlow
41+
return true;
42+
}).ifPresent(v -> {
43+
sink(v); // $hasValueFlow
44+
});
45+
Optional.of("safe").map(v -> {
46+
sink(v); // no value flow
47+
return v;
48+
}).or(() -> o).ifPresent(v -> {
49+
sink(v); // $hasValueFlow
50+
});
51+
Optional<String> safe = Optional.of("safe");
52+
o.or(() -> safe).ifPresent(v -> {
53+
sink(v); // $hasValueFlow
54+
});
55+
String value = safe.orElseGet(() -> source());
56+
sink(value); // $hasValueFlow
57+
}
58+
}

0 commit comments

Comments
 (0)