Java: update remaining models, resolve merge conflict

This commit is contained in:
Jami Cogswell
2022-12-15 00:33:06 -05:00
parent 15069250eb
commit 46b8fbc4c9
11 changed files with 215 additions and 183 deletions

View File

@@ -1,101 +0,0 @@
message,_col1
"java.lang.StringBuilder#append(String)",
"java.util.List#get(int)",
"java.util.List#add(Object)",
"java.util.Map#put(Object,Object)",
"java.lang.String#equals(Object)",
"java.util.Map#get(Object)",
"java.util.List#size()",
"java.util.Collection#stream()",
"java.lang.Object#getClass()",
"java.util.stream.Stream#collect(Collector)",
"java.util.Objects#equals(Object,Object)",
"java.lang.String#format(String,Object\[\])",
"java.util.stream.Stream#map(Function)",
"java.lang.Throwable#getMessage()",
"java.util.Arrays#asList(Object\[\])",
"java.lang.String#equalsIgnoreCase(String)",
"java.util.List#isEmpty()",
"java.util.Set#add(Object)",
"java.util.HashMap#put(Object,Object)",
"java.util.stream.Collectors#toList()",
"java.lang.StringBuilder#append(char)",
"java.util.stream.Stream#filter(Predicate)",
"java.lang.String#length()",
"java.lang.Enum#name()",
"java.lang.Object#toString()",
"java.util.Optional#get()",
"java.lang.StringBuilder#toString()",
"java.lang.IllegalArgumentException#IllegalArgumentException(String)",
"java.lang.Class#getName()",
"java.lang.Enum#Enum(String,int)",
"java.io.PrintWriter#write(String)",
"java.util.Entry#getValue()",
"java.util.Entry#getKey()",
"java.util.Iterator#next()",
"java.lang.Object#hashCode()",
"java.util.Optional#orElse(Object)",
"java.lang.StringBuffer#append(String)",
"java.util.Collections#singletonList(Object)",
"java.lang.Iterable#forEach(Consumer)",
"java.util.Optional#of(Object)",
"java.lang.String#contains(CharSequence)",
"java.util.ArrayList#add(Object)",
"java.util.Optional#ofNullable(Object)",
"java.util.Collections#emptyList()",
"java.math.BigDecimal#BigDecimal(String)",
"java.lang.System#currentTimeMillis()",
"java.lang.Object#equals(Object)",
"java.util.Map#containsKey(Object)",
"java.util.Optional#isPresent()",
"java.lang.String#trim()",
"java.util.List#addAll(Collection)",
"java.util.Set#contains(Object)",
"java.util.Optional#map(Function)",
"java.util.Map#entrySet()",
"java.util.Optional#empty()",
"java.lang.Integer#parseInt(String)",
"java.lang.String#startsWith(String)",
"java.lang.IllegalStateException#IllegalStateException(String)",
"java.lang.Enum#equals(Object)",
"java.util.Iterator#hasNext()",
"java.util.List#contains(Object)",
"java.lang.String#substring(int,int)",
"java.util.List#of(Object)",
"java.util.Objects#hash(Object\[\])",
"java.lang.RuntimeException#RuntimeException(String)",
"java.lang.String#isEmpty()",
"java.lang.String#replace(CharSequence,CharSequence)",
"java.util.Set#size()",
"java.io.File#File(String)",
"java.lang.StringBuilder#append(Object)",
"java.lang.String#split(String)",
"java.util.Map#values()",
"java.util.UUID#randomUUID()",
"java.util.ArrayList#ArrayList(Collection)",
"java.util.Map#keySet()",
"java.sql.ResultSet#getString(String)",
"java.lang.String#hashCode()",
"java.lang.Throwable#Throwable(Throwable)",
"java.util.HashMap#get(Object)",
"java.lang.Class#getSimpleName()",
"java.util.Set#isEmpty()",
"java.util.Map#size()",
"java.lang.String#substring(int)",
"java.util.Map#remove(Object)",
"java.lang.Throwable#printStackTrace()",
"java.util.stream.Stream#findFirst()",
"java.util.Optional#ifPresent(Consumer)",
"java.lang.String#valueOf(Object)",
"java.lang.String#toLowerCase()",
"java.util.UUID#toString()",
"java.lang.StringBuilder#append(int)",
"java.util.Objects#requireNonNull(Object,String)",
"java.nio.file.Path#resolve(String)",
"java.lang.Enum#toString()",
"java.lang.RuntimeException#RuntimeException(Throwable)",
"java.util.Collection#size()",
"java.lang.String#charAt(int)",
"java.util.stream.Stream#forEach(Consumer)",
"java.util.Map#isEmpty()",
"java.lang.String#valueOf(int)"
Can't render this file because it has a wrong number of fields in line 101.

View File

@@ -1,32 +1,18 @@
/** Provides classes and predicates for the Top JDK APIs. */
/** Provides a class to identify Top JDK APIs. */
import java
private import semmle.code.java.dataflow.FlowSummary
private import semmle.code.java.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl
private import semmle.code.java.dataflow.ExternalFlow // for paramsString
private import semmle.code.java.dataflow.ExternalFlow
// Note: from ExternalApi.qll for getting the api name returned in the telemetry query results
// /**
// * Gets information about the external API in the form expected by the CSV modeling framework.
// */
// string getApiName() {
// result =
// this.getDeclaringType().getPackage() + "." + this.getDeclaringType().getSourceDeclaration() +
// "#" + this.getName() + paramsString(this)
// }
class TopJdkApi extends Callable {
TopJdkApi() {
// (
// this instanceof SummarizedCallable or
// this instanceof FlowSummaryImpl::Public::NegativeSummarizedCallable
// ) and
// top 101 jdk apis
//this.asCallable().getQualifiedName() in ["java.util.Set.add"]
exists(string api |
api =
exists(string apiName |
apiName =
this.getDeclaringType().getPackage() + "." + this.getDeclaringType().getSourceDeclaration() +
"#" + this.getName() + paramsString(this) and
api in [
apiName in [
// top 100 JDK APIs
"java.lang.StringBuilder#append(String)", "java.util.List#get(int)",
"java.util.List#add(Object)", "java.util.Map#put(Object,Object)",
"java.lang.String#equals(Object)", "java.util.Map#get(Object)", "java.util.List#size()",
@@ -80,27 +66,18 @@ class TopJdkApi extends Callable {
)
}
/** Holds if this API has a supported summary model. */
private predicate hasSummary() { this = any(SummarizedCallable sc).asCallable() }
/** Holds if this API has a supported neutral model. */
private predicate hasNeutral() {
this = any(FlowSummaryImpl::Public::NegativeSummarizedCallable nsc).asCallable()
/** Holds if this API has a manual summary model. */
private predicate hasManualSummary() {
exists(SummarizedCallable sc | this = sc.asCallable() and sc.hasProvenance(false))
}
// ! note: the below will hold for either manual or generated models, should I restrict to just manual?
/** Holds if this API has a MaD model. */
predicate hasMadModel() { this.hasSummary() or this.hasNeutral() }
/** Holds if this API has a manual neutral model. */
private predicate hasManualNeutral() {
exists(FlowSummaryImpl::Public::NegativeSummarizedCallable nsc |
this = nsc.asCallable() and nsc.hasProvenance(false)
)
}
/** Holds if this API has a manual MaD model. */
predicate hasManualMadModel() { this.hasManualSummary() or this.hasManualNeutral() }
}
// class TopJdkApiSummary extends SummarizedCallableBase {
// TopJdkApiSummary() {
// this instanceof SummarizedCallable and
// this.asCallable().getQualifiedName() in ["java.util.Objects."]
// }
// }
// class TopJdkApiNeutral extends SummarizedCallableBase {
// TopJdkApiNeutral() {
// this instanceof FlowSummaryImpl::Public::NegativeSummarizedCallable and
// this.asCallable().getCompilationUnit().getPackage().getName() = "java.util"
// }
// }

View File

@@ -1 +1,87 @@
| 87 |
| java.io.File#File(String) |
| java.io.PrintWriter#write(String) |
| java.lang.Class#getName() |
| java.lang.Class#getSimpleName() |
| java.lang.Enum#Enum(String,int) |
| java.lang.Enum#equals(Object) |
| java.lang.Enum#name() |
| java.lang.Enum#toString() |
| java.lang.Iterable#forEach(Consumer) |
| java.lang.Object#equals(Object) |
| java.lang.Object#getClass() |
| java.lang.Object#hashCode() |
| java.lang.Object#toString() |
| java.lang.String#charAt(int) |
| java.lang.String#contains(CharSequence) |
| java.lang.String#equals(Object) |
| java.lang.String#equalsIgnoreCase(String) |
| java.lang.String#format(String,Object[]) |
| java.lang.String#hashCode() |
| java.lang.String#isEmpty() |
| java.lang.String#length() |
| java.lang.String#replace(CharSequence,CharSequence) |
| java.lang.String#split(String) |
| java.lang.String#startsWith(String) |
| java.lang.String#substring(int) |
| java.lang.String#substring(int,int) |
| java.lang.String#toLowerCase() |
| java.lang.String#trim() |
| java.lang.StringBuffer#append(String) |
| java.lang.StringBuilder#append(Object) |
| java.lang.StringBuilder#append(String) |
| java.lang.StringBuilder#append(char) |
| java.lang.StringBuilder#append(int) |
| java.lang.StringBuilder#toString() |
| java.lang.System#currentTimeMillis() |
| java.nio.file.Path#resolve(String) |
| java.util.ArrayList#ArrayList(Collection) |
| java.util.ArrayList#add(Object) |
| java.util.Arrays#asList(Object[]) |
| java.util.Collection#size() |
| java.util.Collection#stream() |
| java.util.Collections#emptyList() |
| java.util.Collections#singletonList(Object) |
| java.util.Entry#getKey() |
| java.util.Entry#getValue() |
| java.util.HashMap#get(Object) |
| java.util.HashMap#put(Object,Object) |
| java.util.Iterator#hasNext() |
| java.util.Iterator#next() |
| java.util.List#add(Object) |
| java.util.List#addAll(Collection) |
| java.util.List#contains(Object) |
| java.util.List#get(int) |
| java.util.List#isEmpty() |
| java.util.List#of(Object) |
| java.util.List#size() |
| java.util.Map#containsKey(Object) |
| java.util.Map#entrySet() |
| java.util.Map#get(Object) |
| java.util.Map#isEmpty() |
| java.util.Map#keySet() |
| java.util.Map#put(Object,Object) |
| java.util.Map#remove(Object) |
| java.util.Map#size() |
| java.util.Map#values() |
| java.util.Objects#equals(Object,Object) |
| java.util.Objects#hash(Object[]) |
| java.util.Objects#requireNonNull(Object,String) |
| java.util.Optional#empty() |
| java.util.Optional#get() |
| java.util.Optional#ifPresent(Consumer) |
| java.util.Optional#isPresent() |
| java.util.Optional#map(Function) |
| java.util.Optional#of(Object) |
| java.util.Optional#ofNullable(Object) |
| java.util.Optional#orElse(Object) |
| java.util.Set#add(Object) |
| java.util.Set#contains(Object) |
| java.util.Set#isEmpty() |
| java.util.Set#size() |
| java.util.UUID#randomUUID() |
| java.util.UUID#toString() |
| java.util.stream.Collectors#toList() |
| java.util.stream.Stream#filter(Predicate) |
| java.util.stream.Stream#findFirst() |
| java.util.stream.Stream#forEach(Consumer) |
| java.util.stream.Stream#map(Function) |

View File

@@ -1,43 +1,17 @@
/**
* @name Test for top JDK APIs
* @description Provides a test case to check that a manual models exists for each each of the top JDK APIs.
* @id java/top-jdk-apis-test
*/
import java
import semmle.code.java.dataflow.FlowSummary
import semmle.code.java.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl
import semmle.code.java.dataflow.ExternalFlow // for paramsString
import semmle.code.java.dataflow.ExternalFlow
import TopJdkApis
// from SummarizedCallable sc //, FlowSummaryImpl::Public::NegativeSummarizedCallable nsc
// where
// // sc.asCallable().getDeclaringType().getName() = "String" and
// // sc.asCallable().getName() = "format" and
// // sc.asCallable().getQualifiedName() = "java.lang.String.format" and
// sc.asCallable().getDeclaringType().getPackage() + "." +
// sc.asCallable().getDeclaringType().getSourceDeclaration() + "#" + sc.asCallable().getName() +
// paramsString(sc.asCallable()) = "java.lang.String#format(String,Object[])"
// select sc, sc.asCallable().getQualifiedName(),
// /*
// * sc.asCallable().paramsString(),
// * sc.asCallable().getSignature(), sc.asCallable().getStringSignature(),
// * sc.asCallable().getDeclaringType().getSourceDeclaration(),
// */
// sc.asCallable().getDeclaringType().getPackage() + "." +
// sc.asCallable().getDeclaringType().getSourceDeclaration() + "#" + sc.asCallable().getName() +
// paramsString(sc.asCallable())
// * get string representation of al modelled topjdkapis
// from TopJdkApi t, string api
// where
// /*t.hasMadModel() and*/
// api =
// t.getDeclaringType().getPackage() + "." + t.getDeclaringType().getSourceDeclaration() + "#" +
// t.getName() + paramsString(t)
// select api order by api
// * get count of all modelled topjdkapis
select count(string api |
exists(TopJdkApi t |
/*t.hasMadModel() and*/
api =
t.getDeclaringType().getPackage() + "." + t.getDeclaringType().getSourceDeclaration() + "#" +
t.getName() + paramsString(t)
)
)
// from TopJdkApi t
// where t.hasMadModel()
// select t order by t
from TopJdkApi topApi, string apiName
where
topApi.hasManualMadModel() and
apiName =
topApi.getDeclaringType().getPackage() + "." + topApi.getDeclaringType().getSourceDeclaration() +
"#" + topApi.getName() + paramsString(topApi)
select apiName order by apiName