Skip to content

Commit fdcaa93

Browse files
Jami CogswellJami Cogswell
authored andcommitted
Java: update test case
1 parent f01ee9e commit fdcaa93

File tree

3 files changed

+85
-160
lines changed

3 files changed

+85
-160
lines changed

java/ql/test/ext/TopJdkApis/TopJdkApis.qll

Lines changed: 72 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -5,77 +5,90 @@ private import semmle.code.java.dataflow.FlowSummary
55
private import semmle.code.java.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl
66
private import semmle.code.java.dataflow.ExternalFlow
77

8-
class TopJdkApi extends Callable {
8+
predicate topJdkApiName(string apiName) {
9+
apiName in [
10+
// top 100 JDK APIs
11+
"java.lang.StringBuilder#append(String)", "java.util.List#get(int)",
12+
"java.util.List#add(Object)", "java.util.Map#put(Object,Object)",
13+
"java.lang.String#equals(Object)", "java.util.Map#get(Object)", "java.util.List#size()",
14+
"java.util.Collection#stream()", "java.lang.Object#getClass()",
15+
"java.util.stream.Stream#collect(Collector)", "java.util.Objects#equals(Object,Object)",
16+
"java.lang.String#format(String,Object[])", "java.util.stream.Stream#map(Function)",
17+
"java.lang.Throwable#getMessage()", "java.util.Arrays#asList(Object[])",
18+
"java.lang.String#equalsIgnoreCase(String)", "java.util.List#isEmpty()",
19+
"java.util.Set#add(Object)", "java.util.HashMap#put(Object,Object)",
20+
"java.util.stream.Collectors#toList()", "java.lang.StringBuilder#append(char)",
21+
"java.util.stream.Stream#filter(Predicate)", "java.lang.String#length()",
22+
"java.lang.Enum#name()", "java.lang.Object#toString()", "java.util.Optional#get()",
23+
"java.lang.StringBuilder#toString()",
24+
"java.lang.IllegalArgumentException#IllegalArgumentException(String)",
25+
"java.lang.Class#getName()", "java.lang.Enum#Enum(String,int)",
26+
"java.io.PrintWriter#write(String)", "java.util.Entry#getValue()", "java.util.Entry#getKey()",
27+
"java.util.Iterator#next()", "java.lang.Object#hashCode()",
28+
"java.util.Optional#orElse(Object)", "java.lang.StringBuffer#append(String)",
29+
"java.util.Collections#singletonList(Object)", "java.lang.Iterable#forEach(Consumer)",
30+
"java.util.Optional#of(Object)", "java.lang.String#contains(CharSequence)",
31+
"java.util.ArrayList#add(Object)", "java.util.Optional#ofNullable(Object)",
32+
"java.util.Collections#emptyList()", "java.math.BigDecimal#BigDecimal(String)",
33+
"java.lang.System#currentTimeMillis()", "java.lang.Object#equals(Object)",
34+
"java.util.Map#containsKey(Object)", "java.util.Optional#isPresent()",
35+
"java.lang.String#trim()", "java.util.List#addAll(Collection)",
36+
"java.util.Set#contains(Object)", "java.util.Optional#map(Function)",
37+
"java.util.Map#entrySet()", "java.util.Optional#empty()",
38+
"java.lang.Integer#parseInt(String)", "java.lang.String#startsWith(String)",
39+
"java.lang.IllegalStateException#IllegalStateException(String)",
40+
"java.lang.Enum#equals(Object)", "java.util.Iterator#hasNext()",
41+
"java.util.List#contains(Object)", "java.lang.String#substring(int,int)",
42+
"java.util.List#of(Object)", "java.util.Objects#hash(Object[])",
43+
"java.lang.RuntimeException#RuntimeException(String)", "java.lang.String#isEmpty()",
44+
"java.lang.String#replace(CharSequence,CharSequence)", "java.util.Set#size()",
45+
"java.io.File#File(String)", "java.lang.StringBuilder#append(Object)",
46+
"java.lang.String#split(String)", "java.util.Map#values()", "java.util.UUID#randomUUID()",
47+
"java.util.ArrayList#ArrayList(Collection)", "java.util.Map#keySet()",
48+
"java.sql.ResultSet#getString(String)", "java.lang.String#hashCode()",
49+
"java.lang.Throwable#Throwable(Throwable)", "java.util.HashMap#get(Object)",
50+
"java.lang.Class#getSimpleName()", "java.util.Set#isEmpty()", "java.util.Map#size()",
51+
"java.lang.String#substring(int)", "java.util.Map#remove(Object)",
52+
"java.lang.Throwable#printStackTrace()", "java.util.stream.Stream#findFirst()",
53+
"java.util.Optional#ifPresent(Consumer)", "java.lang.String#valueOf(Object)",
54+
"java.lang.String#toLowerCase()", "java.util.UUID#toString()",
55+
"java.lang.StringBuilder#append(int)", "java.util.Objects#requireNonNull(Object,String)",
56+
"java.nio.file.Path#resolve(String)", "java.lang.Enum#toString()",
57+
"java.lang.RuntimeException#RuntimeException(Throwable)", "java.util.Collection#size()",
58+
"java.lang.String#charAt(int)", "java.util.stream.Stream#forEach(Consumer)",
59+
"java.util.Map#isEmpty()", "java.lang.String#valueOf(int)"
60+
]
61+
}
62+
63+
predicate hasCallable(string apiName) {
64+
exists(Callable c |
65+
apiName =
66+
c.getDeclaringType().getPackage() + "." + c.getDeclaringType().getSourceDeclaration() + "#" +
67+
c.getName() + paramsString(c)
68+
)
69+
}
70+
71+
class TopJdkApi extends SummarizedCallableBase {
972
TopJdkApi() {
1073
exists(string apiName |
1174
apiName =
12-
this.getDeclaringType().getPackage() + "." + this.getDeclaringType().getSourceDeclaration() +
13-
"#" + this.getName() + paramsString(this) and
14-
apiName in [
15-
// top 100 JDK APIs
16-
"java.lang.StringBuilder#append(String)", "java.util.List#get(int)",
17-
"java.util.List#add(Object)", "java.util.Map#put(Object,Object)",
18-
"java.lang.String#equals(Object)", "java.util.Map#get(Object)", "java.util.List#size()",
19-
"java.util.Collection#stream()", "java.lang.Object#getClass()",
20-
"java.util.stream.Stream#collect(Collector)", "java.util.Objects#equals(Object,Object)",
21-
"java.lang.String#format(String,Object[])", "java.util.stream.Stream#map(Function)",
22-
"java.lang.Throwable#getMessage()", "java.util.Arrays#asList(Object[])",
23-
"java.lang.String#equalsIgnoreCase(String)", "java.util.List#isEmpty()",
24-
"java.util.Set#add(Object)", "java.util.HashMap#put(Object,Object)",
25-
"java.util.stream.Collectors#toList()", "java.lang.StringBuilder#append(char)",
26-
"java.util.stream.Stream#filter(Predicate)", "java.lang.String#length()",
27-
"java.lang.Enum#name()", "java.lang.Object#toString()", "java.util.Optional#get()",
28-
"java.lang.StringBuilder#toString()",
29-
"java.lang.IllegalArgumentException#IllegalArgumentException(String)",
30-
"java.lang.Class#getName()", "java.lang.Enum#Enum(String,int)",
31-
"java.io.PrintWriter#write(String)", "java.util.Entry#getValue()",
32-
"java.util.Entry#getKey()", "java.util.Iterator#next()", "java.lang.Object#hashCode()",
33-
"java.util.Optional#orElse(Object)", "java.lang.StringBuffer#append(String)",
34-
"java.util.Collections#singletonList(Object)", "java.lang.Iterable#forEach(Consumer)",
35-
"java.util.Optional#of(Object)", "java.lang.String#contains(CharSequence)",
36-
"java.util.ArrayList#add(Object)", "java.util.Optional#ofNullable(Object)",
37-
"java.util.Collections#emptyList()", "java.math.BigDecimal#BigDecimal(String)",
38-
"java.lang.System#currentTimeMillis()", "java.lang.Object#equals(Object)",
39-
"java.util.Map#containsKey(Object)", "java.util.Optional#isPresent()",
40-
"java.lang.String#trim()", "java.util.List#addAll(Collection)",
41-
"java.util.Set#contains(Object)", "java.util.Optional#map(Function)",
42-
"java.util.Map#entrySet()", "java.util.Optional#empty()",
43-
"java.lang.Integer#parseInt(String)", "java.lang.String#startsWith(String)",
44-
"java.lang.IllegalStateException#IllegalStateException(String)",
45-
"java.lang.Enum#equals(Object)", "java.util.Iterator#hasNext()",
46-
"java.util.List#contains(Object)", "java.lang.String#substring(int,int)",
47-
"java.util.List#of(Object)", "java.util.Objects#hash(Object[])",
48-
"java.lang.RuntimeException#RuntimeException(String)", "java.lang.String#isEmpty()",
49-
"java.lang.String#replace(CharSequence,CharSequence)", "java.util.Set#size()",
50-
"java.io.File#File(String)", "java.lang.StringBuilder#append(Object)",
51-
"java.lang.String#split(String)", "java.util.Map#values()", "java.util.UUID#randomUUID()",
52-
"java.util.ArrayList#ArrayList(Collection)", "java.util.Map#keySet()",
53-
"java.sql.ResultSet#getString(String)", "java.lang.String#hashCode()",
54-
"java.lang.Throwable#Throwable(Throwable)", "java.util.HashMap#get(Object)",
55-
"java.lang.Class#getSimpleName()", "java.util.Set#isEmpty()", "java.util.Map#size()",
56-
"java.lang.String#substring(int)", "java.util.Map#remove(Object)",
57-
"java.lang.Throwable#printStackTrace()", "java.util.stream.Stream#findFirst()",
58-
"java.util.Optional#ifPresent(Consumer)", "java.lang.String#valueOf(Object)",
59-
"java.lang.String#toLowerCase()", "java.util.UUID#toString()",
60-
"java.lang.StringBuilder#append(int)", "java.util.Objects#requireNonNull(Object,String)",
61-
"java.nio.file.Path#resolve(String)", "java.lang.Enum#toString()",
62-
"java.lang.RuntimeException#RuntimeException(Throwable)", "java.util.Collection#size()",
63-
"java.lang.String#charAt(int)", "java.util.stream.Stream#forEach(Consumer)",
64-
"java.util.Map#isEmpty()", "java.lang.String#valueOf(int)"
65-
]
75+
this.asCallable().getDeclaringType().getPackage() + "." +
76+
this.asCallable().getDeclaringType().getSourceDeclaration() + "#" +
77+
this.asCallable().getName() + paramsString(this.asCallable()) and
78+
topJdkApiName(apiName)
6679
)
6780
}
6881

6982
/** Holds if this API has a manual summary model. */
7083
private predicate hasManualSummary() {
71-
exists(SummarizedCallable sc | this = sc.asCallable() and sc.hasProvenance(false))
84+
this instanceof SummarizedCallable and
85+
this.(SummarizedCallable).hasProvenance(false)
7286
}
7387

7488
/** Holds if this API has a manual neutral model. */
7589
private predicate hasManualNeutral() {
76-
exists(FlowSummaryImpl::Public::NeutralCallable nsc |
77-
this = nsc.asCallable() and nsc.hasProvenance(false)
78-
)
90+
this instanceof FlowSummaryImpl::Public::NeutralCallable and
91+
this.(FlowSummaryImpl::Public::NeutralCallable).hasProvenance(false)
7992
}
8093

8194
/** Holds if this API has a manual MaD model. */
Lines changed: 3 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,3 @@
1-
| java.io.File#File(String) |
2-
| java.io.PrintWriter#write(String) |
3-
| java.lang.Class#getName() |
4-
| java.lang.Class#getSimpleName() |
5-
| java.lang.Enum#Enum(String,int) |
6-
| java.lang.Enum#equals(Object) |
7-
| java.lang.Enum#name() |
8-
| java.lang.Enum#toString() |
9-
| java.lang.IllegalArgumentException#IllegalArgumentException(String) |
10-
| java.lang.IllegalStateException#IllegalStateException(String) |
11-
| java.lang.Integer#parseInt(String) |
12-
| java.lang.Iterable#forEach(Consumer) |
13-
| java.lang.Object#equals(Object) |
14-
| java.lang.Object#getClass() |
15-
| java.lang.Object#hashCode() |
16-
| java.lang.Object#toString() |
17-
| java.lang.RuntimeException#RuntimeException(String) |
18-
| java.lang.RuntimeException#RuntimeException(Throwable) |
19-
| java.lang.String#charAt(int) |
20-
| java.lang.String#contains(CharSequence) |
21-
| java.lang.String#equals(Object) |
22-
| java.lang.String#equalsIgnoreCase(String) |
23-
| java.lang.String#format(String,Object[]) |
24-
| java.lang.String#hashCode() |
25-
| java.lang.String#isEmpty() |
26-
| java.lang.String#length() |
27-
| java.lang.String#replace(CharSequence,CharSequence) |
28-
| java.lang.String#split(String) |
29-
| java.lang.String#startsWith(String) |
30-
| java.lang.String#substring(int) |
31-
| java.lang.String#substring(int,int) |
32-
| java.lang.String#toLowerCase() |
33-
| java.lang.String#trim() |
34-
| java.lang.String#valueOf(int) |
35-
| java.lang.StringBuffer#append(String) |
36-
| java.lang.StringBuilder#append(Object) |
37-
| java.lang.StringBuilder#append(String) |
38-
| java.lang.StringBuilder#append(char) |
39-
| java.lang.StringBuilder#append(int) |
40-
| java.lang.StringBuilder#toString() |
41-
| java.lang.System#currentTimeMillis() |
42-
| java.lang.Throwable#Throwable(Throwable) |
43-
| java.lang.Throwable#getMessage() |
44-
| java.math.BigDecimal#BigDecimal(String) |
45-
| java.nio.file.Path#resolve(String) |
46-
| java.sql.ResultSet#getString(String) |
47-
| java.util.ArrayList#ArrayList(Collection) |
48-
| java.util.ArrayList#add(Object) |
49-
| java.util.Arrays#asList(Object[]) |
50-
| java.util.Collection#size() |
51-
| java.util.Collection#stream() |
52-
| java.util.Collections#emptyList() |
53-
| java.util.Collections#singletonList(Object) |
54-
| java.util.Entry#getKey() |
55-
| java.util.Entry#getValue() |
56-
| java.util.HashMap#get(Object) |
57-
| java.util.HashMap#put(Object,Object) |
58-
| java.util.Iterator#hasNext() |
59-
| java.util.Iterator#next() |
60-
| java.util.List#add(Object) |
61-
| java.util.List#addAll(Collection) |
62-
| java.util.List#contains(Object) |
63-
| java.util.List#get(int) |
64-
| java.util.List#isEmpty() |
65-
| java.util.List#of(Object) |
66-
| java.util.List#size() |
67-
| java.util.Map#containsKey(Object) |
68-
| java.util.Map#entrySet() |
69-
| java.util.Map#get(Object) |
70-
| java.util.Map#isEmpty() |
71-
| java.util.Map#keySet() |
72-
| java.util.Map#put(Object,Object) |
73-
| java.util.Map#remove(Object) |
74-
| java.util.Map#size() |
75-
| java.util.Map#values() |
76-
| java.util.Objects#equals(Object,Object) |
77-
| java.util.Objects#hash(Object[]) |
78-
| java.util.Objects#requireNonNull(Object,String) |
79-
| java.util.Optional#empty() |
80-
| java.util.Optional#get() |
81-
| java.util.Optional#ifPresent(Consumer) |
82-
| java.util.Optional#isPresent() |
83-
| java.util.Optional#map(Function) |
84-
| java.util.Optional#of(Object) |
85-
| java.util.Optional#ofNullable(Object) |
86-
| java.util.Optional#orElse(Object) |
87-
| java.util.Set#add(Object) |
88-
| java.util.Set#contains(Object) |
89-
| java.util.Set#isEmpty() |
90-
| java.util.Set#size() |
91-
| java.util.UUID#randomUUID() |
92-
| java.util.UUID#toString() |
93-
| java.util.stream.Collectors#toList() |
94-
| java.util.stream.Stream#filter(Predicate) |
95-
| java.util.stream.Stream#findFirst() |
96-
| java.util.stream.Stream#forEach(Consumer) |
97-
| java.util.stream.Stream#map(Function) |
1+
| java.lang.String#valueOf(Object) |
2+
| java.lang.Throwable#printStackTrace() |
3+
| java.util.stream.Stream#collect(Collector) |

java/ql/test/ext/TopJdkApis/TopJdkApisTest.ql

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,16 @@ import java
88
import semmle.code.java.dataflow.ExternalFlow
99
import TopJdkApis
1010

11-
from TopJdkApi topApi, string apiName
11+
from string apiName, TopJdkApi topApi
1212
where
13-
topApi.hasManualMadModel() and
13+
// top jdk api names for which there is no callable
14+
topJdkApiName(apiName) and
15+
not hasCallable(apiName)
16+
or
17+
// top jdk api names for which there isn't a manual model
18+
not topApi.hasManualMadModel() and
1419
apiName =
15-
topApi.getDeclaringType().getPackage() + "." + topApi.getDeclaringType().getSourceDeclaration() +
16-
"#" + topApi.getName() + paramsString(topApi)
20+
topApi.asCallable().getDeclaringType().getPackage() + "." +
21+
topApi.asCallable().getDeclaringType().getSourceDeclaration() + "#" +
22+
topApi.asCallable().getName() + paramsString(topApi.asCallable())
1723
select apiName order by apiName

0 commit comments

Comments
 (0)