Merge pull request #12680 from jcogs33/jcogs33/metrics-query-refactor-top500

Java: test GeneratedVsManualCoverage query on top 500 JDK APIs
This commit is contained in:
Jami
2023-04-06 10:07:35 -04:00
committed by GitHub
143 changed files with 2535 additions and 64 deletions

View File

@@ -7,71 +7,15 @@
*/
import java
import semmle.code.java.dataflow.FlowSummary
import utils.modelgenerator.internal.CaptureModels
/**
* Returns the number of `DataFlowTargetApi`s with Summary MaD models
* for a given package and provenance.
*/
bindingset[package]
private int getNumMadModeledApis(string package, string provenance) {
provenance in ["generated", "manual", "both"] and
result =
count(SummarizedCallable sc |
package = sc.asCallable().getCompilationUnit().getPackage().getName() and
sc.asCallable() instanceof DataFlowTargetApi and
(
// "auto-only"
sc.isAutoGenerated() and
provenance = "generated"
or
sc.isManual() and
(
if sc.hasProvenance(["generated", "ai-generated"])
then
// "both"
provenance = "both"
else
// "manual-only"
provenance = "manual"
)
)
)
}
/** Returns the total number of `DataFlowTargetApi`s for a given package. */
private int getNumApis(string package) {
result =
strictcount(DataFlowTargetApi dataFlowTargApi |
package = dataFlowTargApi.getCompilationUnit().getPackage().getName()
)
}
import GeneratedVsManualCoverageQuery
from
string package, int generatedOnly, int both, int manualOnly, int generated, int manual, int non,
int all, float coverage, float generatedCoverage, float manualCoverage,
float manualCoveredByGenerated, float generatedCoveredByManual, float match
string package, int generatedOnly, int both, int manualOnly, int non, int all, float coverage,
float generatedCoverage, float manualCoverage, float manualCoveredByGenerated,
float generatedCoveredByManual, float match
where
// count the number of APIs with generated-only, both, and manual-only MaD models for each package
generatedOnly = getNumMadModeledApis(package, "generated") and
both = getNumMadModeledApis(package, "both") and
manualOnly = getNumMadModeledApis(package, "manual") and
// calculate the total generated and total manual numbers
generated = generatedOnly + both and
manual = manualOnly + both and
// count the total number of `DataFlowTargetApi`s for each package
all = getNumApis(package) and
non = all - (generatedOnly + both + manualOnly) and
// Proportion of coverage
coverage = (generatedOnly + both + manualOnly).(float) / all and
generatedCoverage = generated.(float) / all and
manualCoverage = manual.(float) / all and
// Proportion of manual models covered by generated ones
manualCoveredByGenerated = both.(float) / (both + manualOnly) and
// Proportion of generated models covered by manual ones
generatedCoveredByManual = both.(float) / (both + generatedOnly) and
// Proportion of data points that match
match = (both.(float) + non) / all
modelCoverageGenVsMan(package, generatedOnly, both, manualOnly, non, all, coverage,
generatedCoverage, manualCoverage, manualCoveredByGenerated, generatedCoveredByManual, match,
"allApis")
select package, generatedOnly, both, manualOnly, non, all, coverage, generatedCoverage,
manualCoverage, manualCoveredByGenerated, generatedCoveredByManual, match order by package

View File

@@ -0,0 +1,86 @@
private import semmle.code.java.dataflow.FlowSummary
private import utils.modelgenerator.internal.CaptureModels
private import TopJdkApis
/**
* Returns the number of `DataFlowTargetApi`s with Summary MaD models
* for a given package and provenance.
*/
bindingset[package, apiSubset]
private int getNumMadModeledApis(string package, string provenance, string apiSubset) {
provenance in ["generated", "manual", "both"] and
result =
count(SummarizedCallable sc |
callableSubset(sc.asCallable(), apiSubset) and
package = sc.asCallable().getCompilationUnit().getPackage().getName() and
sc.asCallable() instanceof DataFlowTargetApi and
(
// "auto-only"
sc.isAutoGenerated() and
provenance = "generated"
or
sc.isManual() and
(
if sc.hasProvenance(["generated", "ai-generated"])
then
// "both"
provenance = "both"
else
// "manual-only"
provenance = "manual"
)
)
)
}
/** Returns the total number of `DataFlowTargetApi`s for a given package. */
private int getNumApis(string package, string apiSubset) {
result =
strictcount(DataFlowTargetApi dataFlowTargApi |
callableSubset(dataFlowTargApi, apiSubset) and
package = dataFlowTargApi.getCompilationUnit().getPackage().getName()
)
}
/** Holds if the given `callable` belongs to the specified `apiSubset`. */
private predicate callableSubset(Callable callable, string apiSubset) {
apiSubset in ["topJdkApis", "allApis"] and
(
if apiSubset = "topJdkApis"
then exists(TopJdkApi topJdkApi | callable = topJdkApi.asCallable())
else apiSubset = "allApis"
)
}
/**
* Provides MaD summary model coverage information for the given `package`
* on the given `apiSubset`.
*/
predicate modelCoverageGenVsMan(
string package, int generatedOnly, int both, int manualOnly, int non, int all, float coverage,
float generatedCoverage, float manualCoverage, float manualCoveredByGenerated,
float generatedCoveredByManual, float match, string apiSubset
) {
exists(int generated, int manual |
// count the number of APIs with generated-only, both, and manual-only MaD models for each package
generatedOnly = getNumMadModeledApis(package, "generated", apiSubset) and
both = getNumMadModeledApis(package, "both", apiSubset) and
manualOnly = getNumMadModeledApis(package, "manual", apiSubset) and
// calculate the total generated and total manual numbers
generated = generatedOnly + both and
manual = manualOnly + both and
// count the total number of `DataFlowTargetApi`s for each package
all = getNumApis(package, apiSubset) and
non = all - (generatedOnly + both + manualOnly) and
// Proportion of coverage
coverage = (generatedOnly + both + manualOnly).(float) / all and
generatedCoverage = generated.(float) / all and
manualCoverage = manual.(float) / all and
// Proportion of manual models covered by generated ones
manualCoveredByGenerated = both.(float) / (both + manualOnly) and
// Proportion of generated models covered by manual ones
generatedCoveredByManual = both.(float) / (both + generatedOnly) and
// Proportion of data points that match
match = (both.(float) + non) / all
)
}

View File

@@ -0,0 +1,326 @@
/** Provides classes and predicates for working with 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
/** Holds if the given API name is a top JDK API. */
predicate topJdkApiName(string apiName) {
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()",
"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)",
// top 200 JDK APIs
"java.lang.Integer#intValue()", "java.util.ArrayList#size()",
"java.util.ArrayList#ArrayList(int)", "java.util.function.Function#apply(Object)",
"java.util.stream.Stream#forEach(Consumer)", "java.util.ArrayList#get(int)",
"java.util.Set#iterator()", "java.util.stream.Collectors#toSet()",
"java.lang.String#replaceAll(String,String)", "java.lang.String#getBytes(Charset)",
"java.util.Objects#requireNonNull(Object)", "java.util.Objects#nonNull(Object)",
"java.lang.String#endsWith(String)", "java.lang.AbstractStringBuilder#length()",
"java.sql.PreparedStatement#setString(int,String)",
"java.util.regex.Pattern#matcher(CharSequence)", "java.nio.file.Path#toString()",
"java.time.Instant#now()", "java.io.File#getAbsolutePath()",
"java.util.Set#addAll(Collection)", "java.lang.Integer#valueOf(int)",
"java.util.HashSet#HashSet(Collection)", "java.lang.Integer#toString(int)",
"java.lang.StringBuilder#StringBuilder(String)", "java.lang.Thread#sleep(long)",
"java.lang.Thread#currentThread()", "java.util.Date#getTime()",
"java.io.Writer#write(String)", "java.lang.String#getBytes()", "java.io.File#exists()",
"java.lang.String#toUpperCase()", "java.lang.Long#parseLong(String)",
"java.util.Collections#emptyMap()", "java.util.Optional#orElseThrow(Supplier)",
"java.util.List#of(Object,Object)", "java.util.concurrent.CountDownLatch#countDown()",
"java.lang.Class#isAssignableFrom(Class)",
"java.lang.IndexOutOfBoundsException#IndexOutOfBoundsException(String)",
"java.lang.Throwable#getCause()", "java.util.Arrays#stream(Object[])",
"java.util.function.Supplier#get()", "java.lang.Exception#Exception(String)",
"java.util.function.Consumer#accept(Object)", "java.util.stream.Stream#anyMatch(Predicate)",
"java.util.List#clear()", "java.io.File#File(File,String)",
"java.lang.String#indexOf(String)", "java.util.List#iterator()",
"java.util.concurrent.CountDownLatch#CountDownLatch(int)", "java.sql.ResultSet#next()",
"java.sql.PreparedStatement#setInt(int,int)",
"java.util.concurrent.atomic.AtomicInteger#get()",
"java.util.stream.Collectors#toMap(Function,Function)", "java.lang.Math#min(int,int)",
"java.lang.Long#equals(Object)", "java.util.Properties#setProperty(String,String)",
"java.util.Map#getOrDefault(Object,Object)", "java.lang.System#getProperty(String)",
"java.util.stream.Stream#of(Object[])", "java.nio.file.Paths#get(String,String[])",
"java.math.BigDecimal#compareTo(BigDecimal)", "java.math.BigDecimal#valueOf(long)",
"java.lang.RuntimeException#RuntimeException(String,Throwable)",
"java.util.Collection#add(Object)", "java.util.Collections#emptySet()",
"java.util.stream.Stream#flatMap(Function)",
"java.util.concurrent.atomic.AtomicReference#get()", "java.util.Collection#isEmpty()",
"java.lang.StringBuffer#toString()", "java.util.Collections#singleton(Object)",
"java.io.File#getName()", "java.time.ZonedDateTime#now()",
"java.io.ByteArrayInputStream#ByteArrayInputStream(byte[])", "java.nio.file.Path#toFile()",
"java.util.Date#Date(long)", "java.lang.System#nanoTime()",
"java.util.Hashtable#put(Object,Object)", "java.util.Map#putAll(Map)",
"java.lang.Long#toString()", "java.util.List#toArray(Object[])", "java.io.File#toPath()",
"java.util.regex.Matcher#group(int)", "java.time.LocalDate#of(int,int,int)",
"java.lang.String#valueOf(long)", "java.math.BigDecimal#valueOf(double)",
"java.io.IOException#IOException(String)", "java.text.DateFormat#format(Date)",
"java.sql.ResultSet#getInt(String)", "java.util.Map#clear()", "java.util.HashSet#add(Object)",
"java.lang.Class#getClassLoader()", "java.lang.Boolean#equals(Object)",
"java.lang.String#concat(String)", "java.util.Collections#singletonMap(Object,Object)",
"java.util.Collection#iterator()", "java.util.Map#computeIfAbsent(Object,Function)",
"java.text.SimpleDateFormat#SimpleDateFormat(String)",
"java.util.StringJoiner#add(CharSequence)", "java.lang.Long#longValue()",
"java.util.stream.Collectors#joining(CharSequence)",
// top 300 JDK APIs
"java.lang.Math#max(int,int)", "java.util.Map#of(Object,Object)",
"java.lang.Long#valueOf(long)", "java.util.Random#nextInt(int)",
"java.lang.Long#valueOf(String)", "java.util.concurrent.CountDownLatch#await(long,TimeUnit)",
"java.util.Properties#getProperty(String)", "java.util.Optional#isEmpty()",
"java.util.concurrent.CompletableFuture#get()", "java.util.Objects#isNull(Object)",
"java.lang.StringBuilder#append(long)", "java.awt.Container#add(Component,Object)",
"java.math.BigDecimal#add(BigDecimal)", "java.sql.PreparedStatement#executeQuery()",
"java.lang.StringBuilder#StringBuilder(int)", "java.util.Map#forEach(BiConsumer)",
"java.math.BigDecimal#BigDecimal(int)", "java.util.Collections#unmodifiableList(List)",
"java.util.Properties#put(Object,Object)", "java.sql.Timestamp#Timestamp(long)",
"java.util.List#equals(Object)", "java.lang.String#indexOf(int)",
"java.lang.Long#toString(long)", "java.lang.Integer#Integer(int)",
"java.util.concurrent.atomic.AtomicBoolean#get()",
"java.lang.System#setProperty(String,String)", "java.util.concurrent.Future#get()",
"java.lang.Thread#start()", "java.util.Set#of(Object)", "java.util.Calendar#set(int,int)",
"java.time.Duration#ofSeconds(long)", "java.lang.System#arraycopy(Object,int,Object,int,int)",
"java.net.URI#toString()", "java.util.concurrent.atomic.AtomicInteger#incrementAndGet()",
"java.util.Set#remove(Object)", "java.lang.Boolean#parseBoolean(String)",
"java.util.Calendar#getTime()", "java.nio.charset.Charset#name()",
"java.lang.ThreadLocal#get()", "java.lang.Class#getCanonicalName()",
"java.util.List#remove(Object)", "java.lang.Throwable#toString()",
"java.util.stream.Stream#toList()", "java.io.ByteArrayOutputStream#toByteArray()",
"java.util.concurrent.atomic.AtomicLong#get()",
"java.lang.NullPointerException#NullPointerException(String)", "java.util.List#of()",
"java.util.Calendar#getInstance()", "java.util.Calendar#get(int)",
"java.util.Optional#orElseThrow()", "java.lang.System#lineSeparator()",
"java.lang.Boolean#booleanValue()", "java.util.logging.Logger#isLoggable(Level)",
"java.lang.Enum#hashCode()", "java.util.List#hashCode()",
"java.lang.reflect.Method#invoke(Object,Object[])", "java.lang.String#String(byte[],Charset)",
"java.util.Comparator#comparing(Function)", "java.util.Arrays#toString(Object[])",
"java.time.LocalDate#now()", "java.util.function.Function#identity()",
"java.io.OutputStream#write(byte[])", "java.lang.Integer#equals(Object)",
"java.io.BufferedReader#BufferedReader(Reader)", "java.io.DataInput#readInt()",
"java.io.BufferedReader#readLine()", "java.util.Map#entry(Object,Object)",
"java.lang.Runnable#run()", "java.util.ResourceBundle#getString(String)",
"java.util.Iterator#remove()", "java.lang.String#join(CharSequence,Iterable)",
"java.util.concurrent.atomic.AtomicBoolean#set(boolean)", "java.time.LocalDateTime#now()",
"java.sql.ResultSet#getLong(String)", "java.text.DateFormat#parse(String)",
"java.lang.String#toString()", "java.lang.Integer#valueOf(String)",
"java.util.regex.Matcher#find()", "java.io.DataOutput#writeInt(int)",
"java.util.HashMap#HashMap(int)", "java.util.stream.Stream#sorted(Comparator)",
"java.lang.String#toCharArray()",
"java.util.concurrent.atomic.AtomicInteger#AtomicInteger(int)",
"java.lang.String#String(byte[])", "java.lang.reflect.Method#getName()",
"java.sql.ResultSet#getString(int)", "java.net.URI#create(String)",
"java.lang.Enum#ordinal()", "java.util.concurrent.atomic.AtomicReference#set(Object)",
"java.util.concurrent.CompletableFuture#join()",
"java.io.FileInputStream#FileInputStream(File)", "java.io.File#delete()",
"java.util.concurrent.TimeUnit#toMillis(long)", "java.util.List#of(Object,Object,Object)",
"java.lang.String#compareTo(String)", "java.util.stream.IntStream#range(int,int)",
"java.math.BigInteger#valueOf(long)", "java.util.List#remove(int)",
"java.util.HashMap#HashMap(Map)", "java.util.function.BiConsumer#accept(Object,Object)",
// top 400 JDK APIs
"java.util.HashMap#containsKey(Object)", "java.util.Collection#contains(Object)",
"java.lang.Double#parseDouble(String)", "java.lang.Thread#interrupt()",
"java.awt.Container#add(Component)", "java.time.chrono.ChronoZonedDateTime#toInstant()",
"java.util.List#subList(int,int)", "java.util.concurrent.ConcurrentHashMap#get(Object)",
"java.lang.System#getenv(String)", "java.time.Duration#ofMillis(long)",
"java.lang.Integer#toString()", "java.lang.reflect.Constructor#newInstance(Object[])",
"java.util.Hashtable#get(Object)", "java.lang.Class#toString()",
"java.util.Vector#add(Object)", "java.io.StringReader#StringReader(String)",
"java.io.File#getPath()", "java.lang.System#identityHashCode(Object)",
"java.util.stream.Stream#count()", "java.util.concurrent.CompletableFuture#complete(Object)",
"java.nio.file.Files#exists(Path,LinkOption[])", "java.util.List#set(int,Object)",
"java.util.concurrent.atomic.AtomicLong#AtomicLong(long)",
"java.util.Optional#orElseGet(Supplier)", "java.lang.Class#forName(String)",
"java.lang.String#replace(char,char)", "java.util.Enumeration#nextElement()",
"java.lang.Class#getMethod(String,Class[])", "java.nio.file.Path#toAbsolutePath()",
"java.util.Enumeration#hasMoreElements()", "java.lang.Class#cast(Object)",
"java.util.concurrent.atomic.AtomicBoolean#AtomicBoolean(boolean)",
"java.math.BigDecimal#doubleValue()", "java.util.UUID#fromString(String)",
"java.lang.System#exit(int)", "java.util.List#add(int,Object)",
"java.lang.Boolean#valueOf(boolean)", "java.sql.Timestamp#getTime()",
"java.nio.Buffer#remaining()", "java.net.URL#URL(String)", "java.net.URI#URI(String)",
"java.util.Objects#hashCode(Object)", "java.util.Set#clear()", "java.io.File#isDirectory()",
"java.time.Duration#toMillis()", "java.nio.ByteBuffer#allocate(int)",
"java.math.BigDecimal#toString()", "java.lang.Class#getResourceAsStream(String)",
"java.util.logging.Logger#getLogger(String)", "java.lang.String#toLowerCase(Locale)",
"java.util.concurrent.CompletableFuture#completeExceptionally(Throwable)",
"java.util.stream.Stream#findAny()",
"java.util.concurrent.CompletableFuture#completedFuture(Object)",
"java.util.stream.Stream#of(Object)", "java.util.Map#of(Object,Object,Object,Object)",
"java.util.Collections#sort(List,Comparator)", "java.lang.Thread#Thread(Runnable)",
"java.lang.String#lastIndexOf(int)",
"java.io.UncheckedIOException#UncheckedIOException(IOException)",
"java.util.LinkedHashSet#LinkedHashSet(Collection)",
"java.sql.PreparedStatement#executeUpdate()", "java.time.ZoneId#of(String)",
"java.util.concurrent.atomic.AtomicLong#addAndGet(long)", "java.nio.ByteBuffer#wrap(byte[])",
"java.util.List#indexOf(Object)", "java.util.Collections#unmodifiableMap(Map)",
"java.lang.Long#Long(long)", "java.util.StringTokenizer#nextToken()",
"java.lang.String#join(CharSequence,CharSequence[])", "java.io.StringWriter#toString()",
"java.lang.Integer#toHexString(int)", "java.lang.Long#intValue()",
"java.text.MessageFormat#format(String,Object[])",
"java.lang.Exception#Exception(String,Throwable)",
"java.util.stream.Stream#toArray(IntFunction)", "java.util.List#sort(Comparator)",
"java.util.LinkedHashMap#get(Object)", "java.sql.PreparedStatement#setLong(int,long)",
"java.lang.Iterable#iterator()", "java.math.BigInteger#or(BigInteger)",
"java.time.LocalDateTime#of(int,int,int,int,int,int)", "java.time.Instant#toEpochMilli()",
"java.math.BigDecimal#setScale(int,RoundingMode)", "java.lang.Class#isInstance(Object)",
"java.util.regex.Pattern#compile(String)", "java.util.Calendar#getTimeInMillis()",
"java.lang.Class#getResource(String)", "java.util.concurrent.Executor#execute(Runnable)",
"java.util.concurrent.locks.Lock#unlock()", "java.lang.AssertionError#AssertionError(Object)",
"java.util.ArrayList#addAll(Collection)", "java.io.File#mkdirs()",
"java.time.Duration#ofMinutes(long)", "java.time.format.DateTimeFormatter#ofPattern(String)",
"java.lang.Throwable#getLocalizedMessage()", "java.lang.StringBuilder#delete(int,int)",
"java.util.Vector#size()", "java.lang.String#String(String)", "java.util.ArrayList#isEmpty()",
"java.util.Collection#removeIf(Predicate)",
// top 500 JDK APIs
"java.util.HashSet#HashSet(int)", "java.util.Set#of(Object,Object)",
"java.util.Collections#unmodifiableSet(Set)", "java.sql.Connection#createStatement()",
"java.math.BigDecimal#subtract(BigDecimal)", "java.util.Date#from(Instant)",
"java.lang.StringBuffer#append(char)", "java.util.Locale#forLanguageTag(String)",
"java.io.DataInput#readLong()", "java.util.Collections#sort(List)",
"java.io.DataOutput#writeLong(long)", "java.util.function.BiFunction#apply(Object,Object)",
"java.lang.String#lastIndexOf(String)", "java.util.Optional#filter(Predicate)",
"java.lang.StringBuffer#append(Object)", "java.io.File#getParentFile()",
"java.util.stream.Stream#allMatch(Predicate)", "java.sql.ResultSet#getTimestamp(String)",
"java.util.Calendar#setTime(Date)",
"java.util.concurrent.CompletionStage#toCompletableFuture()",
"java.util.concurrent.locks.Lock#lock()", "java.lang.reflect.Field#get(Object)",
"java.io.InputStream#close()", "java.math.BigInteger#BigInteger(String)",
"java.lang.Class#getDeclaredField(String)",
"java.io.InputStreamReader#InputStreamReader(InputStream)", "java.lang.Runtime#getRuntime()",
"java.lang.Class#getDeclaredConstructor(Class[])",
"java.lang.AbstractStringBuilder#setLength(int)", "java.nio.Buffer#position()",
"java.nio.file.Path#getFileName()", "java.util.List#toArray()",
"java.lang.CharSequence#length()", "java.util.stream.Stream#distinct()",
"java.net.URL#toURI()", "java.util.Queue#poll()", "java.lang.Thread#getContextClassLoader()",
"java.lang.String#valueOf(boolean)", "java.util.Calendar#add(int,int)",
"java.util.HashMap#entrySet()", "java.util.stream.IntStream#mapToObj(IntFunction)",
"java.util.concurrent.atomic.AtomicLong#incrementAndGet()",
"java.util.concurrent.ExecutorService#shutdown()",
"java.util.concurrent.ExecutorService#submit(Runnable)", "java.math.BigDecimal#intValue()",
"java.math.BigDecimal#toBigInteger()", "java.util.LinkedList#add(Object)",
"java.lang.AbstractStringBuilder#charAt(int)", "java.lang.Thread#getName()",
"java.lang.Math#max(long,long)", "java.util.HashMap#size()",
"java.time.LocalDate#plusDays(long)", "java.nio.ByteBuffer#array()",
"java.lang.StringBuilder#append(CharSequence)", "java.util.Vector#addElement(Object)",
"java.lang.ClassLoader#getResource(String)", "java.awt.Insets#Insets(int,int,int,int)",
"java.util.TimeZone#getTimeZone(String)", "java.time.ZoneId#systemDefault()",
"java.lang.Number#doubleValue()", "java.util.stream.Stream#reduce(Object,BinaryOperator)",
"java.lang.CharSequence#toString()", "java.time.Instant#parse(CharSequence)",
"java.text.Format#format(Object)", "java.io.File#toURI()", "java.sql.ResultSet#getInt(int)",
"java.lang.Number#longValue()", "java.lang.Double#doubleToLongBits(double)",
"java.lang.Math#min(long,long)", "java.lang.Double#valueOf(double)",
"java.lang.invoke.MethodHandles#lookup()", "java.util.concurrent.CompletableFuture#isDone()",
"java.time.LocalDate#parse(CharSequence)", "java.lang.StringBuilder#append(boolean)",
"java.util.concurrent.CountDownLatch#await()",
"java.util.concurrent.ConcurrentHashMap#put(Object,Object)",
"java.util.stream.Stream#mapToInt(ToIntFunction)",
"java.math.BigDecimal#multiply(BigDecimal)", "java.util.stream.Stream#concat(Stream,Stream)",
"java.time.Instant#ofEpochMilli(long)", "java.nio.file.Path#getParent()",
"java.util.stream.Stream#sorted()",
"java.util.concurrent.atomic.AtomicBoolean#compareAndSet(boolean,boolean)",
"java.util.UUID#equals(Object)", "java.io.OutputStream#flush()",
"java.time.format.DateTimeFormatter#format(TemporalAccessor)", "java.io.Closeable#close()",
"java.util.EventObject#getSource()", "java.io.File#File(String,String)",
"java.lang.Number#intValue()", "java.io.File#length()",
"java.lang.AbstractStringBuilder#setCharAt(int,char)", "java.util.Set#removeAll(Collection)",
"java.io.File#listFiles()", "java.lang.ClassLoader#getResourceAsStream(String)",
"java.util.Date#toInstant()", "java.util.Queue#add(Object)", "java.io.File#isFile()",
"java.sql.Statement#close()", "java.io.DataOutput#writeBoolean(boolean)"
]
}
/** Holds if `c` has the MaD-formatted name `apiName`. */
predicate hasApiName(Callable c, string apiName) {
apiName =
c.getDeclaringType().getPackage() + "." + c.getDeclaringType().getSourceDeclaration() + "#" +
c.getName() + paramsString(c)
}
/** A top JDK API. */
class TopJdkApi extends SummarizedCallableBase {
TopJdkApi() {
exists(string apiName |
hasApiName(this.asCallable(), apiName) and
topJdkApiName(apiName)
)
}
/** Holds if this API has a manual summary model. */
private predicate hasManualSummary() { this.(SummarizedCallable).isManual() }
/** Holds if this API has a manual neutral model. */
private predicate hasManualNeutral() {
this.(FlowSummaryImpl::Public::NeutralCallable).isManual()
}
/** Holds if this API has a manual MaD model. */
predicate hasManualMadModel() { this.hasManualSummary() or this.hasManualNeutral() }
/*
* Note: the following top JDK APIs are not modeled with MaD:
* `java.lang.String#valueOf(Object)`: a complex case; an alias for `Object.toString`, except the dispatch is hidden
* `java.lang.System#getProperty(String)`: needs to be modeled by regular CodeQL matching the get and set keys to reduce FPs
* `java.lang.System#setProperty(String,String)`: needs to be modeled by regular CodeQL matching the get and set keys to reduce FPs
* `java.lang.Throwable#printStackTrace()`: should probably not be a general step, but there might be specialised queries that care
* `java.text.Format#format(Object)`: similar issue as `Object.toString`; depends on the object being passed as the argument
* `java.text.MessageFormat#format(String,Object[])`: similar issue as `Object.toString`; depends on the object being passed as the argument
* `java.util.Comparator#comparing(Function)`: lambda flow
* `java.util.function.BiConsumer#accept(Object,Object)`: specialized lambda flow
* `java.util.function.BiFunction#apply(Object,Object)`: specialized lambda flow
* `java.util.function.Consumer#accept(Object)`: specialized lambda flow
* `java.util.function.Function#apply(Object)`: specialized lambda flow
* `java.util.function.Supplier#get()`: lambda flow
* `java.util.stream.Collectors#joining(CharSequence)`: cannot be modeled completely without a model for `java.util.stream.Stream#collect(Collector)` as well
* `java.util.stream.Collectors#toMap(Function,Function)`: specialized collectors flow
* `java.util.stream.Stream#collect(Collector)`: handled separately on a case-by-case basis as it is too complex for MaD
*/
}