File tree Expand file tree Collapse file tree 3 files changed +70
-1
lines changed
lib/semmle/code/java/frameworks
test/library-tests/optional Expand file tree Collapse file tree 3 files changed +70
-1
lines changed Original file line number Diff line number Diff line change
1
+ lgtm,codescanning
2
+ * Added data flow models for lambda methods on ` java.util.Optional ` .
Original file line number Diff line number Diff line change @@ -15,7 +15,16 @@ private class OptionalModel extends SummaryModelCsv {
15
15
"java.util;Optional;false;orElse;;;Argument[0];ReturnValue;value" ,
16
16
"java.util;Optional;false;orElseGet;;;Element of Argument[-1];ReturnValue;value" ,
17
17
"java.util;Optional;false;orElseThrow;;;Element of Argument[-1];ReturnValue;value" ,
18
- "java.util;Optional;false;stream;;;Element of Argument[-1];Element of ReturnValue;value"
18
+ "java.util;Optional;false;stream;;;Element of Argument[-1];Element of ReturnValue;value" ,
19
+ "java.util;Optional;false;ifPresent;;;Element of Argument[-1];Parameter[0] of Argument[0];value" ,
20
+ "java.util;Optional;false;ifPresentOrElse;;;Element of Argument[-1];Parameter[0] of Argument[0];value" ,
21
+ "java.util;Optional;false;map;;;Element of Argument[-1];Parameter[0] of Argument[0];value" ,
22
+ "java.util;Optional;false;map;;;ReturnValue of Argument[0];Element of ReturnValue;value" ,
23
+ "java.util;Optional;false;flatMap;;;Element of Argument[-1];Parameter[0] of Argument[0];value" ,
24
+ "java.util;Optional;false;flatMap;;;ReturnValue of Argument[0];ReturnValue;value" ,
25
+ "java.util;Optional;false;filter;;;Element of Argument[-1];Parameter[0] of Argument[0];value" ,
26
+ "java.util;Optional;false;or;;;ReturnValue of Argument[0];ReturnValue;value" ,
27
+ "java.util;Optional;false;orElseGet;;;ReturnValue of Argument[0];ReturnValue;value"
19
28
]
20
29
}
21
30
}
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments