From 1d1a07e5e1ac72b385238a7eba78a010a4291ee6 Mon Sep 17 00:00:00 2001 From: Mark Roberts Date: Sun, 7 May 2023 08:41:32 -0700 Subject: [PATCH 01/50] Give DataOutput::write same annotations as OutputStream classes --- src/java.base/share/classes/java/io/DataOutput.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/java.base/share/classes/java/io/DataOutput.java b/src/java.base/share/classes/java/io/DataOutput.java index 1f34cf6f06f7f..9bbd78e783d21 100644 --- a/src/java.base/share/classes/java/io/DataOutput.java +++ b/src/java.base/share/classes/java/io/DataOutput.java @@ -28,6 +28,7 @@ import org.checkerframework.checker.index.qual.IndexOrHigh; import org.checkerframework.checker.index.qual.LTLengthOf; import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.signedness.qual.PolySigned; import org.checkerframework.framework.qual.AnnotatedFor; /** @@ -99,7 +100,7 @@ public interface DataOutput { * @param len the number of bytes to write. * @throws IOException if an I/O error occurs. */ - void write(byte b[], @IndexOrHigh({"#1"}) int off, @LTLengthOf(value={"#1"}, offset={"#2 - 1"}) @NonNegative int len) throws IOException; + void write(@PolySigned byte b[], @IndexOrHigh({"#1"}) int off, @LTLengthOf(value={"#1"}, offset={"#2 - 1"}) @NonNegative int len) throws IOException; /** * Writes a {@code boolean} value to this output stream. From e57e2ab8efd9716e99ee3406f733a80af41a3646 Mon Sep 17 00:00:00 2001 From: Michael Ernst Date: Sun, 7 May 2023 08:42:04 -0700 Subject: [PATCH 02/50] Add `@PolySigned` on `OutputStream.write()` --- src/java.base/share/classes/java/io/OutputStream.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/java/io/OutputStream.java b/src/java.base/share/classes/java/io/OutputStream.java index c3827a7d77cd6..c06a012e1d9b6 100644 --- a/src/java.base/share/classes/java/io/OutputStream.java +++ b/src/java.base/share/classes/java/io/OutputStream.java @@ -25,11 +25,11 @@ package java.io; -import org.checkerframework.checker.mustcall.qual.MustCall; import org.checkerframework.checker.index.qual.IndexOrHigh; import org.checkerframework.checker.index.qual.LTLengthOf; import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.interning.qual.UsesObjectEquals; +import org.checkerframework.checker.mustcall.qual.MustCall; import org.checkerframework.checker.signedness.qual.PolySigned; import org.checkerframework.framework.qual.AnnotatedFor; @@ -88,12 +88,12 @@ private void ensureOpen() throws IOException { } @Override - public void write(int b) throws IOException { + public void write(@PolySigned int b) throws IOException { ensureOpen(); } @Override - public void write(byte b[], int off, int len) throws IOException { + public void write(@PolySigned byte b[], int off, int len) throws IOException { Objects.checkFromIndexSize(off, len, b.length); ensureOpen(); } From 956f5a6e560eb73873d27240370a4404a3690847 Mon Sep 17 00:00:00 2001 From: Michael Ernst Date: Wed, 10 May 2023 15:26:48 -0700 Subject: [PATCH 03/50] Add `@SideEffectFree` --- src/java.base/share/classes/java/util/Collections.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/java.base/share/classes/java/util/Collections.java b/src/java.base/share/classes/java/util/Collections.java index e8e7d8f916bb0..8f4ac325bc3a1 100644 --- a/src/java.base/share/classes/java/util/Collections.java +++ b/src/java.base/share/classes/java/util/Collections.java @@ -5825,6 +5825,7 @@ public static boolean addAll(@GuardSatisfied Collection c, T... e * @throws IllegalArgumentException if {@code map} is not empty * @since 1.6 */ + @SideEffectFree public static Set newSetFromMap(Map map) { return new SetFromMap<>(map); } From 85fa8df89ac65908f97b735849111248d8e99ec4 Mon Sep 17 00:00:00 2001 From: Michael Ernst Date: Thu, 11 May 2023 09:50:27 -0700 Subject: [PATCH 04/50] Relax signedness specification in `Object` --- src/java.base/share/classes/java/lang/Object.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/java/lang/Object.java b/src/java.base/share/classes/java/lang/Object.java index cfcb07d0285ae..8da3a8c0cb900 100644 --- a/src/java.base/share/classes/java/lang/Object.java +++ b/src/java.base/share/classes/java/lang/Object.java @@ -34,6 +34,7 @@ import org.checkerframework.checker.mustcall.qual.MustCall; import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.signedness.qual.UnknownSignedness; import org.checkerframework.checker.tainting.qual.Untainted; import org.checkerframework.common.aliasing.qual.Unique; import org.checkerframework.common.reflection.qual.GetClass; @@ -86,7 +87,7 @@ public class Object { @SafeEffect @Pure @IntrinsicCandidate - public final native Class getClass(@PolyUI @GuardSatisfied @UnknownInitialization Object this); + public final native Class getClass(@PolyUI @GuardSatisfied @UnknownInitialization @UnknownSignedness Object this); /** * Returns a hash code value for the object. This method is @@ -123,7 +124,7 @@ public class Object { */ @Pure @IntrinsicCandidate - public native int hashCode(@GuardSatisfied Object this); + public native int hashCode(@GuardSatisfied @UnknownSignedness Object this); /** * Indicates whether some other object is "equal to" this one. From e073c00a358278e3333867e5987dddff62875761 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Mon, 5 Jun 2023 11:08:16 -0400 Subject: [PATCH 05/50] Mark `ScheduledThreadPoolExecutor` as annotated for nullness. (#37) --- .../java/util/concurrent/ScheduledThreadPoolExecutor.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/java.base/share/classes/java/util/concurrent/ScheduledThreadPoolExecutor.java b/src/java.base/share/classes/java/util/concurrent/ScheduledThreadPoolExecutor.java index ec94d37f01081..584a9f05279c1 100644 --- a/src/java.base/share/classes/java/util/concurrent/ScheduledThreadPoolExecutor.java +++ b/src/java.base/share/classes/java/util/concurrent/ScheduledThreadPoolExecutor.java @@ -39,6 +39,7 @@ import org.checkerframework.checker.nullness.qual.PolyNull; import org.checkerframework.checker.signedness.qual.UnknownSignedness; import org.checkerframework.dataflow.qual.Pure; +import org.checkerframework.framework.qual.AnnotatedFor; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.NANOSECONDS; @@ -136,6 +137,7 @@ * @since 1.5 * @author Doug Lea */ +@AnnotatedFor("nullness") public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor implements ScheduledExecutorService { From c41478466b65b185ece03038d50742f53e506742 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Fri, 9 Jun 2023 06:29:29 -0400 Subject: [PATCH 06/50] Annotate the parameter of `List.sort` as `@Nullable`. (#40) --- src/java.base/share/classes/java/util/ArrayList.java | 2 +- src/java.base/share/classes/java/util/List.java | 2 +- src/java.base/share/classes/java/util/Vector.java | 2 +- .../classes/java/util/concurrent/CopyOnWriteArrayList.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/java.base/share/classes/java/util/ArrayList.java b/src/java.base/share/classes/java/util/ArrayList.java index 14aca859e0c96..fa750301acd54 100644 --- a/src/java.base/share/classes/java/util/ArrayList.java +++ b/src/java.base/share/classes/java/util/ArrayList.java @@ -1753,7 +1753,7 @@ private void replaceAllRange(UnaryOperator operator, int i, int end) { @Override @SuppressWarnings("unchecked") - public void sort(Comparator c) { + public void sort(@Nullable Comparator c) { final int expectedModCount = modCount; Arrays.sort((E[]) elementData, 0, size, c); if (modCount != expectedModCount) diff --git a/src/java.base/share/classes/java/util/List.java b/src/java.base/share/classes/java/util/List.java index e414723de3580..a70e0d141127c 100644 --- a/src/java.base/share/classes/java/util/List.java +++ b/src/java.base/share/classes/java/util/List.java @@ -529,7 +529,7 @@ default void replaceAll(UnaryOperator operator) { * @since 1.8 */ @SuppressWarnings({"unchecked", "rawtypes"}) - default void sort(Comparator c) { + default void sort(@Nullable Comparator c) { Object[] a = this.toArray(); Arrays.sort(a, (Comparator) c); ListIterator i = this.listIterator(); diff --git a/src/java.base/share/classes/java/util/Vector.java b/src/java.base/share/classes/java/util/Vector.java index 869ea5dd463cd..b49701d72d718 100644 --- a/src/java.base/share/classes/java/util/Vector.java +++ b/src/java.base/share/classes/java/util/Vector.java @@ -1413,7 +1413,7 @@ public synchronized void replaceAll(UnaryOperator operator) { @SuppressWarnings("unchecked") @Override - public synchronized void sort(Comparator c) { + public synchronized void sort(@Nullable Comparator c) { final int expectedModCount = modCount; Arrays.sort((E[]) elementData, 0, elementCount, c); if (modCount != expectedModCount) diff --git a/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArrayList.java b/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArrayList.java index 59a065540328c..4f9be8b86a6b7 100644 --- a/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArrayList.java +++ b/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArrayList.java @@ -897,7 +897,7 @@ void replaceAllRange(UnaryOperator operator, int i, int end) { setArray(es); } - public void sort(Comparator c) { + public void sort(@Nullable Comparator c) { synchronized (lock) { sortRange(c, 0, getArray().length); } From 7e9c413c6b55b5eead6077e7bb67f01c978ad2f2 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Sun, 11 Jun 2023 13:11:20 -0400 Subject: [PATCH 07/50] Minor improvements to `Map.merge` usage of `@PolyNull` and `@NonNull`. (#41) --- src/java.base/share/classes/java/util/Collections.java | 10 +++++----- src/java.base/share/classes/java/util/HashMap.java | 2 +- src/java.base/share/classes/java/util/Hashtable.java | 2 +- .../share/classes/java/util/ImmutableCollections.java | 2 +- src/java.base/share/classes/java/util/Map.java | 6 +----- src/java.base/share/classes/java/util/TreeMap.java | 4 +++- .../java/util/concurrent/ConcurrentHashMap.java | 2 +- .../classes/java/util/concurrent/ConcurrentMap.java | 2 +- .../java/util/concurrent/ConcurrentSkipListMap.java | 2 +- 9 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/java.base/share/classes/java/util/Collections.java b/src/java.base/share/classes/java/util/Collections.java index e8e7d8f916bb0..34b1342b26f91 100644 --- a/src/java.base/share/classes/java/util/Collections.java +++ b/src/java.base/share/classes/java/util/Collections.java @@ -1637,7 +1637,7 @@ public V replace(K key, V value) { @Override public @PolyNull V merge(K key, @NonNull V value, - BiFunction remappingFunction) { + BiFunction remappingFunction) { throw new UnsupportedOperationException(); } @@ -2839,7 +2839,7 @@ public V replace(K key, V value) { } @Override public @PolyNull V merge(K key, @NonNull V value, - BiFunction remappingFunction) { + BiFunction remappingFunction) { synchronized (mutex) {return m.merge(key, value, remappingFunction);} } @@ -3923,7 +3923,7 @@ public V replace(K key, V value) { @Override public @PolyNull V merge(K key, @NonNull V value, - BiFunction remappingFunction) { + BiFunction remappingFunction) { Objects.requireNonNull(remappingFunction); return m.merge(key, value, (v1, v2) -> { V newValue = remappingFunction.apply(v1, v2); @@ -4924,7 +4924,7 @@ public V replace(K key, V value) { @Override public @PolyNull V merge(K key, @NonNull V value, - BiFunction remappingFunction) { + BiFunction remappingFunction) { throw new UnsupportedOperationException(); } @@ -5270,7 +5270,7 @@ public V replace(K key, V value) { @Override public @PolyNull V merge(K key, @NonNull V value, - BiFunction remappingFunction) { + BiFunction remappingFunction) { throw new UnsupportedOperationException(); } diff --git a/src/java.base/share/classes/java/util/HashMap.java b/src/java.base/share/classes/java/util/HashMap.java index 5076d384796e0..013de094a44a4 100644 --- a/src/java.base/share/classes/java/util/HashMap.java +++ b/src/java.base/share/classes/java/util/HashMap.java @@ -1389,7 +1389,7 @@ else if (v != null) { */ @Override public @PolyNull V merge(K key, @NonNull V value, - BiFunction remappingFunction) { + BiFunction remappingFunction) { if (value == null || remappingFunction == null) throw new NullPointerException(); int hash = hash(key); diff --git a/src/java.base/share/classes/java/util/Hashtable.java b/src/java.base/share/classes/java/util/Hashtable.java index 134c014a5882f..0fac5ee8daa2a 100644 --- a/src/java.base/share/classes/java/util/Hashtable.java +++ b/src/java.base/share/classes/java/util/Hashtable.java @@ -1193,7 +1193,7 @@ public synchronized V replace(K key, V value) { * remapping function modified this map */ @Override - public synchronized @PolyNull V merge(K key, @NonNull V value, BiFunction remappingFunction) { + public synchronized @PolyNull V merge(K key, @NonNull V value, BiFunction remappingFunction) { Objects.requireNonNull(remappingFunction); Entry tab[] = table; diff --git a/src/java.base/share/classes/java/util/ImmutableCollections.java b/src/java.base/share/classes/java/util/ImmutableCollections.java index e0a23febde000..cacee333a15cd 100644 --- a/src/java.base/share/classes/java/util/ImmutableCollections.java +++ b/src/java.base/share/classes/java/util/ImmutableCollections.java @@ -1084,7 +1084,7 @@ abstract static class AbstractImmutableMap extends AbstractMap impleme @Override public @PolyNull V compute(K key, BiFunction rf) { throw uoe(); } @Override public @PolyNull V computeIfAbsent(K key, Function mf) { throw uoe(); } @Override public @PolyNull V computeIfPresent(K key, BiFunction rf) { throw uoe(); } - @Override public @PolyNull V merge(K key, @NonNull V value, BiFunction rf) { throw uoe(); } + @Override public @PolyNull V merge(K key, @NonNull V value, BiFunction rf) { throw uoe(); } @Override public V put(K key, V value) { throw uoe(); } @Override public void putAll(Map m) { throw uoe(); } @Override public V putIfAbsent(K key, V value) { throw uoe(); } diff --git a/src/java.base/share/classes/java/util/Map.java b/src/java.base/share/classes/java/util/Map.java index d08d6981af3d7..c242e10135e0b 100644 --- a/src/java.base/share/classes/java/util/Map.java +++ b/src/java.base/share/classes/java/util/Map.java @@ -1349,12 +1349,8 @@ default boolean replace(K key, V oldValue, V newValue) { * null * @since 1.8 */ - @CFComment({ - "It would be more flexible to make the return type of remappingFunction be `@Nullable V`. A", - "remappingFunction that returns null is is probably rare, and these annotations accommodate", - "the majority of uses that don't return null."}) default @PolyNull V merge(K key, @NonNull V value, - BiFunction remappingFunction) { + BiFunction remappingFunction) { Objects.requireNonNull(remappingFunction); Objects.requireNonNull(value); V oldValue = get(key); diff --git a/src/java.base/share/classes/java/util/TreeMap.java b/src/java.base/share/classes/java/util/TreeMap.java index a528c177b7a21..9c37e584d146f 100644 --- a/src/java.base/share/classes/java/util/TreeMap.java +++ b/src/java.base/share/classes/java/util/TreeMap.java @@ -30,7 +30,9 @@ import org.checkerframework.checker.nullness.qual.EnsuresKeyFor; import org.checkerframework.checker.nullness.qual.EnsuresKeyForIf; import org.checkerframework.checker.nullness.qual.KeyFor; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.nullness.qual.PolyNull; import org.checkerframework.checker.signedness.qual.UnknownSignedness; import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.dataflow.qual.SideEffectFree; @@ -723,7 +725,7 @@ else if (cmp > 0) * remapping function modified this map */ @Override - public V merge(K key, V value, BiFunction remappingFunction) { + public @PolyNull V merge(K key, @NonNull V value, BiFunction remappingFunction) { Objects.requireNonNull(remappingFunction); Objects.requireNonNull(value); Entry t = root; diff --git a/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java b/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java index 3b0bf73be1fde..346a8988c12a2 100644 --- a/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java +++ b/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java @@ -2052,7 +2052,7 @@ else if (f instanceof ReservationNode) * @throws RuntimeException or Error if the remappingFunction does so, * in which case the mapping is unchanged */ - public @PolyNull V merge(K key, @NonNull V value, BiFunction remappingFunction) { + public @PolyNull V merge(K key, @NonNull V value, BiFunction remappingFunction) { if (key == null || value == null || remappingFunction == null) throw new NullPointerException(); int h = spread(key.hashCode()); diff --git a/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java b/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java index 018492522c1a4..68388107d2263 100644 --- a/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java +++ b/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java @@ -484,7 +484,7 @@ else if ((oldValue = putIfAbsent(key, newValue)) == null) */ @Override default @PolyNull V merge(K key, @NonNull V value, - BiFunction remappingFunction) { + BiFunction remappingFunction) { Objects.requireNonNull(remappingFunction); Objects.requireNonNull(value); retry: for (;;) { diff --git a/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java b/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java index 770296e0353fe..57a498f42b63d 100644 --- a/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java +++ b/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java @@ -1564,7 +1564,7 @@ else if (doRemove(key, v) != null) * @since 1.8 */ public @PolyNull V merge(K key, @NonNull V value, - BiFunction remappingFunction) { + BiFunction remappingFunction) { if (key == null || value == null || remappingFunction == null) throw new NullPointerException(); for (;;) { From 3bef90623eb39d3d2b3501f73bbc8fe40b09286b Mon Sep 17 00:00:00 2001 From: Werner Dietl Date: Sun, 11 Jun 2023 13:11:55 -0400 Subject: [PATCH 08/50] Remove useless `checker-qual.jar` file and update instructions (#42) --- README.md | 22 ++++++++++++---------- checker-qual.jar | Bin 251532 -> 0 bytes make/CompileInterimLangtools.gmk | 2 +- make/autoconf/spec.gmk.in | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-) delete mode 100644 checker-qual.jar diff --git a/README.md b/README.md index 5ba7254edeaa5..c59c20b6309cf 100644 --- a/README.md +++ b/README.md @@ -107,23 +107,24 @@ resolve conflicts. Then, discard the branch in the fork of jdk17u. The java.base module contains a copy of the Checker Framework qualifiers (type annotations). To update that copy, run from this directory: +``` (cd $CHECKERFRAMEWORK && rm -rf checker-qual/build/libs && ./gradlew :checker-qual:sourcesJar) && \ -rm -f checker-qual.jar && \ -cp -p $CHECKERFRAMEWORK/checker-qual/build/libs/checker-qual-*-sources.jar checker-qual.jar && \ +rm -f checker-qual-sources.jar && \ +cp -p $CHECKERFRAMEWORK/checker-qual/build/libs/checker-qual-*-sources.jar checker-qual-sources.jar && \ (cd src/java.base/share/classes && rm -rf org/checkerframework && \ - unzip ../../../../checker-qual.jar -x 'META-INF*' && \ - rm -f org/checkerframework/checker/signedness/SignednessUtilExtra.java && \ + unzip ../../../../checker-qual-sources.jar -x 'META-INF*' && \ chmod -R u+w org/checkerframework) && \ -jar tf checker-qual.jar | grep '\.java$' | sed 's/\/[^/]*\.java/;/' | sed 's/\//./g' | sed 's/^/ exports /' | sort | uniq +jar tf checker-qual-sources.jar | grep '\.java$' | sed 's/\/[^/]*\.java/;/' | sed 's/\//./g' | sed 's/^/ exports /' | sort | uniq +``` -Copy the exports lines that were printed by the last command to -src/java.base/share/classes/module-info.java . -Commit the changes, including the changed top-level `checker-qual.jar` file. +Copy/update the exports lines that were printed by the last command to +`src/java.base/share/classes/module-info.java` . +Commit the changes. Do not include the top-level `checker-qual-source.jar` file. ## The typetools/jdk17u repository -The typetools/jdk17u repository is a merge of `openjdk/jdk17u` and `typetools/jdk`. +The `typetools/jdk17u` repository is a merge of `openjdk/jdk17u` and `typetools/jdk`. That is, it is a fork of `openjdk/jdk17u`, with Checker Framework type annotations. **Do not edit the `typetools/jdk17u` repository.** @@ -150,6 +151,7 @@ Clone jdk${VER}u repositories into, say, $t/libraries/ . Determine the last commit in both openjdk:jdk and in openjdk:jdk${VER}u: run `git log --graph | tac` on both and find the common prefix. +``` last_common_commit=d562d3fcbe22a0443037c5b447e1a41401275814 cd $t/libraries git clone -- git@github.com:openjdk/jdk.git jdk-fork-openjdk-commit-${last_common_commit} @@ -158,7 +160,7 @@ git reset --hard ${last_common_commit} cd $t/libraries/jdk-fork-${USER}-branch-jdk${VER} git pull ../jdk-fork-openjdk-commit-${last_common_commit} - +``` ## Design diff --git a/checker-qual.jar b/checker-qual.jar deleted file mode 100644 index 1c015b96e57aa3af5f0e98f0627b64a1943a8574..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251532 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: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 U7*Le?LGy$Dv=}d0Q3sInUsrRsD*ylh diff --git a/make/CompileInterimLangtools.gmk b/make/CompileInterimLangtools.gmk index 556fef00da263..a2f4cd84ae848 100644 --- a/make/CompileInterimLangtools.gmk +++ b/make/CompileInterimLangtools.gmk @@ -83,7 +83,7 @@ define SetupInterimModule DISABLED_WARNINGS := module options, \ JAVAC_FLAGS := \ --module-path $(BUILDTOOLS_OUTPUTDIR)/interim_langtools_modules \ - -cp $(TOPDIR)/checker-qual.jar \ + -cp $(TOPDIR)/src/java.base/share/classes/ \ --add-reads $1.interim=ALL-UNNAMED \ $$(INTERIM_LANGTOOLS_ADD_EXPORTS) \ --patch-module java.base=$(BUILDTOOLS_OUTPUTDIR)/gensrc/java.base.interim \ diff --git a/make/autoconf/spec.gmk.in b/make/autoconf/spec.gmk.in index bf8f481bd47d1..1c9b8b2fb9298 100644 --- a/make/autoconf/spec.gmk.in +++ b/make/autoconf/spec.gmk.in @@ -672,7 +672,7 @@ INTERIM_LANGTOOLS_ARGS := \ --add-modules $(INTERIM_LANGTOOLS_MODULES_COMMA) \ --module-path $(BUILDTOOLS_OUTPUTDIR)/interim_langtools_modules \ --patch-module java.base=$(BUILDTOOLS_OUTPUTDIR)/gensrc/java.base.interim \ - -cp $(TOPDIR)/checker-qual.jar \ + -cp $(TOPDIR)/src/java.base/share/classes/ \ $(INTERIM_LANGTOOLS_ADD_EXPORTS) \ # JAVAC_MAIN_CLASS = -m jdk.compiler.interim/com.sun.tools.javac.Main From 8d7ef605568bde17303eee9a5eae3d8829829f18 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Mon, 12 Jun 2023 12:06:16 -0400 Subject: [PATCH 09/50] Annotate `PrintWriter.out` as `@Nullable`. (#43) --- src/java.base/share/classes/java/io/PrintWriter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java.base/share/classes/java/io/PrintWriter.java b/src/java.base/share/classes/java/io/PrintWriter.java index 21c6a06f7f6fa..a38e6c69ce645 100644 --- a/src/java.base/share/classes/java/io/PrintWriter.java +++ b/src/java.base/share/classes/java/io/PrintWriter.java @@ -76,7 +76,7 @@ public class PrintWriter extends Writer { * * @since 1.2 */ - protected Writer out; + protected @Nullable Writer out; private final boolean autoFlush; private boolean trouble = false; From 193a4a28449f59ae4217e8b4f52486f2f5c63e67 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Mon, 19 Jun 2023 04:19:18 -0400 Subject: [PATCH 10/50] Annotate recent `TreeMap` overrides of `compute` and `computeIfAbsent`. (#46) --- src/java.base/share/classes/java/util/TreeMap.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/java/util/TreeMap.java b/src/java.base/share/classes/java/util/TreeMap.java index 9c37e584d146f..7df27dab9606e 100644 --- a/src/java.base/share/classes/java/util/TreeMap.java +++ b/src/java.base/share/classes/java/util/TreeMap.java @@ -572,7 +572,7 @@ public V putIfAbsent(K key, V value) { * mapping function modified this map */ @Override - public V computeIfAbsent(K key, Function mappingFunction) { + public @PolyNull V computeIfAbsent(K key, Function mappingFunction) { Objects.requireNonNull(mappingFunction); V newValue; Entry t = root; @@ -663,7 +663,7 @@ public V computeIfPresent(K key, BiFunction r * remapping function modified this map */ @Override - public V compute(K key, BiFunction remappingFunction) { + public @PolyNull V compute(K key, BiFunction remappingFunction) { Objects.requireNonNull(remappingFunction); V newValue; Entry t = root; From 9220642b904732d08eee9fe921a9e9eb448f27df Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Mon, 19 Jun 2023 04:23:15 -0400 Subject: [PATCH 11/50] Omit `@NonNull` from `merge` in maps that reject null values. (#47) --- src/java.base/share/classes/java/util/Hashtable.java | 2 +- .../share/classes/java/util/concurrent/ConcurrentHashMap.java | 2 +- .../share/classes/java/util/concurrent/ConcurrentMap.java | 4 ++-- .../classes/java/util/concurrent/ConcurrentSkipListMap.java | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/java.base/share/classes/java/util/Hashtable.java b/src/java.base/share/classes/java/util/Hashtable.java index 0fac5ee8daa2a..65fddafb6bdee 100644 --- a/src/java.base/share/classes/java/util/Hashtable.java +++ b/src/java.base/share/classes/java/util/Hashtable.java @@ -1193,7 +1193,7 @@ public synchronized V replace(K key, V value) { * remapping function modified this map */ @Override - public synchronized @PolyNull V merge(K key, @NonNull V value, BiFunction remappingFunction) { + public synchronized @PolyNull V merge(K key, V value, BiFunction remappingFunction) { Objects.requireNonNull(remappingFunction); Entry tab[] = table; diff --git a/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java b/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java index 346a8988c12a2..0c27aab1361be 100644 --- a/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java +++ b/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java @@ -2052,7 +2052,7 @@ else if (f instanceof ReservationNode) * @throws RuntimeException or Error if the remappingFunction does so, * in which case the mapping is unchanged */ - public @PolyNull V merge(K key, @NonNull V value, BiFunction remappingFunction) { + public @PolyNull V merge(K key, V value, BiFunction remappingFunction) { if (key == null || value == null || remappingFunction == null) throw new NullPointerException(); int h = spread(key.hashCode()); diff --git a/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java b/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java index 68388107d2263..345f185dc902a 100644 --- a/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java +++ b/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java @@ -483,8 +483,8 @@ else if ((oldValue = putIfAbsent(key, newValue)) == null) * @since 1.8 */ @Override - default @PolyNull V merge(K key, @NonNull V value, - BiFunction remappingFunction) { + default @PolyNull V merge(K key, V value, + BiFunction remappingFunction) { Objects.requireNonNull(remappingFunction); Objects.requireNonNull(value); retry: for (;;) { diff --git a/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java b/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java index 57a498f42b63d..55b2f951fc96b 100644 --- a/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java +++ b/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java @@ -1563,8 +1563,8 @@ else if (doRemove(key, v) != null) * or the remappingFunction is null * @since 1.8 */ - public @PolyNull V merge(K key, @NonNull V value, - BiFunction remappingFunction) { + public @PolyNull V merge(K key, V value, + BiFunction remappingFunction) { if (key == null || value == null || remappingFunction == null) throw new NullPointerException(); for (;;) { From 193a0c45257322a8c311607819246f3c3a3ba1fe Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Mon, 19 Jun 2023 08:09:07 -0400 Subject: [PATCH 12/50] Use `@NonNull` in `Map.computeIfPresent` (plus `@PolyNull` in recent `TreeMap` override). (#45) --- src/java.base/share/classes/java/util/HashMap.java | 2 +- src/java.base/share/classes/java/util/Map.java | 2 +- src/java.base/share/classes/java/util/TreeMap.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/java/util/HashMap.java b/src/java.base/share/classes/java/util/HashMap.java index 013de094a44a4..40501d58f5e47 100644 --- a/src/java.base/share/classes/java/util/HashMap.java +++ b/src/java.base/share/classes/java/util/HashMap.java @@ -1290,7 +1290,7 @@ else if (t != null) */ @Override public @PolyNull V computeIfPresent(K key, - BiFunction remappingFunction) { + BiFunction remappingFunction) { if (remappingFunction == null) throw new NullPointerException(); Node e; V oldValue; diff --git a/src/java.base/share/classes/java/util/Map.java b/src/java.base/share/classes/java/util/Map.java index c242e10135e0b..311b45adff588 100644 --- a/src/java.base/share/classes/java/util/Map.java +++ b/src/java.base/share/classes/java/util/Map.java @@ -1166,7 +1166,7 @@ default boolean replace(K key, V oldValue, V newValue) { * @since 1.8 */ default @PolyNull V computeIfPresent(K key, - BiFunction remappingFunction) { + BiFunction remappingFunction) { Objects.requireNonNull(remappingFunction); V oldValue; if ((oldValue = get(key)) != null) { diff --git a/src/java.base/share/classes/java/util/TreeMap.java b/src/java.base/share/classes/java/util/TreeMap.java index 7df27dab9606e..ee2dade06f8e3 100644 --- a/src/java.base/share/classes/java/util/TreeMap.java +++ b/src/java.base/share/classes/java/util/TreeMap.java @@ -642,7 +642,7 @@ else if (cmp > 0) * remapping function modified this map */ @Override - public V computeIfPresent(K key, BiFunction remappingFunction) { + public @PolyNull V computeIfPresent(K key, BiFunction remappingFunction) { Objects.requireNonNull(remappingFunction); Entry oldEntry = getEntry(key); if (oldEntry != null && oldEntry.value != null) { From 8e84031d58e9368ca5c7a77c22aa7acb5c8f1c3f Mon Sep 17 00:00:00 2001 From: Michael Ernst Date: Fri, 23 Jun 2023 11:59:04 -0700 Subject: [PATCH 13/50] Sort `@Poly*` annotations --- src/java.base/share/classes/java/lang/Byte.java | 12 ++++++------ .../share/classes/java/lang/Integer.java | 8 ++++---- src/java.base/share/classes/java/lang/Long.java | 6 +++--- src/java.base/share/classes/java/lang/Short.java | 10 +++++----- .../share/classes/java/lang/String.java | 4 ++-- .../share/classes/java/util/Arrays.java | 16 ++++++++-------- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/java.base/share/classes/java/lang/Byte.java b/src/java.base/share/classes/java/lang/Byte.java index 0e7c0bb12f2e6..8e704b31923ac 100644 --- a/src/java.base/share/classes/java/lang/Byte.java +++ b/src/java.base/share/classes/java/lang/Byte.java @@ -166,7 +166,7 @@ private ByteCache() {} @Pure @StaticallyExecutable @IntrinsicCandidate - public static @Interned @NewObject @PolyIndex @PolyValue @PolySigned Byte valueOf(@PolyIndex @PolyValue @PolySigned byte b) { + public static @Interned @NewObject @PolyIndex @PolySigned @PolyValue Byte valueOf(@PolyIndex @PolySigned @PolyValue byte b) { final int offset = 128; return ByteCache.cache[(int)b + offset]; } @@ -380,7 +380,7 @@ public static byte parseByte(String s) throws NumberFormatException { */ @StaticallyExecutable @Deprecated(since="9", forRemoval = true) - public @PolyIndex @PolyValue @PolySigned Byte(@PolyIndex @PolyValue @PolySigned byte value) { + public @PolyIndex @PolySigned @PolyValue Byte(@PolyIndex @PolySigned @PolyValue byte value) { this.value = value; } @@ -415,7 +415,7 @@ public Byte(String s) throws NumberFormatException { @Pure @StaticallyExecutable @IntrinsicCandidate - public @PolyIndex @PolyValue @PolySigned byte byteValue(@PolyIndex @PolyValue @PolySigned Byte this) { + public @PolyIndex @PolySigned @PolyValue byte byteValue(@PolyIndex @PolySigned @PolyValue Byte this) { return value; } @@ -426,7 +426,7 @@ public Byte(String s) throws NumberFormatException { */ @Pure @StaticallyExecutable - public @PolyIndex @PolyValue @PolySigned short shortValue(@PolyIndex @PolyValue @PolySigned Byte this) { + public @PolyIndex @PolySigned @PolyValue short shortValue(@PolyIndex @PolySigned @PolyValue Byte this) { return (short)value; } @@ -437,7 +437,7 @@ public Byte(String s) throws NumberFormatException { */ @Pure @StaticallyExecutable - public @PolyIndex @PolyValue @PolySigned int intValue(@PolyIndex @PolyValue @PolySigned Byte this) { + public @PolyIndex @PolySigned @PolyValue int intValue(@PolyIndex @PolySigned @PolyValue Byte this) { return (int)value; } @@ -448,7 +448,7 @@ public Byte(String s) throws NumberFormatException { */ @Pure @StaticallyExecutable - public @PolyIndex @PolyValue @PolySigned long longValue(@PolyIndex @PolyValue @PolySigned Byte this) { + public @PolyIndex @PolySigned @PolyValue long longValue(@PolyIndex @PolySigned @PolyValue Byte this) { return (long)value; } diff --git a/src/java.base/share/classes/java/lang/Integer.java b/src/java.base/share/classes/java/lang/Integer.java index 3713f2c2140f5..b0e70ec947ebe 100644 --- a/src/java.base/share/classes/java/lang/Integer.java +++ b/src/java.base/share/classes/java/lang/Integer.java @@ -1134,7 +1134,7 @@ private IntegerCache() {} @SideEffectFree @StaticallyExecutable @IntrinsicCandidate - public static @NewObject @PolyIndex @PolyValue @PolySigned Integer valueOf(@PolyIndex @PolyValue @PolySigned int i) { + public static @NewObject @PolyIndex @PolySigned @PolyValue Integer valueOf(@PolyIndex @PolySigned @PolyValue int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); @@ -1162,7 +1162,7 @@ private IntegerCache() {} @SideEffectFree @StaticallyExecutable @Deprecated(since="9", forRemoval = true) - public @PolyIndex @PolyValue @PolySigned Integer(@PolyIndex @PolyValue @PolySigned int value) { + public @PolyIndex @PolySigned @PolyValue Integer(@PolyIndex @PolySigned @PolyValue int value) { this.value = value; } @@ -1219,7 +1219,7 @@ public Integer(String s) throws NumberFormatException { @Pure @StaticallyExecutable @IntrinsicCandidate - public @PolyIndex @PolyValue @PolySigned int intValue(@PolyIndex @PolyValue @PolySigned Integer this) { + public @PolyIndex @PolySigned @PolyValue int intValue(@PolyIndex @PolySigned @PolyValue Integer this) { return value; } @@ -1231,7 +1231,7 @@ public Integer(String s) throws NumberFormatException { */ @Pure @StaticallyExecutable - public @PolyIndex @PolyValue @PolySigned long longValue(@PolyIndex @PolyValue @PolySigned Integer this) { + public @PolyIndex @PolySigned @PolyValue long longValue(@PolyIndex @PolySigned @PolyValue Integer this) { return (long)value; } diff --git a/src/java.base/share/classes/java/lang/Long.java b/src/java.base/share/classes/java/lang/Long.java index caa3e63bda468..33abaa3d59dcf 100644 --- a/src/java.base/share/classes/java/lang/Long.java +++ b/src/java.base/share/classes/java/lang/Long.java @@ -1258,7 +1258,7 @@ private LongCache() {} @SideEffectFree @StaticallyExecutable @IntrinsicCandidate - public static @NewObject @PolyValue @PolySigned Long valueOf(@PolyValue @PolySigned long l) { + public static @NewObject @PolySigned @PolyValue Long valueOf(@PolySigned @PolyValue long l) { final int offset = 128; if (l >= -128 && l <= 127) { // will cache return LongCache.cache[(int)l + offset]; @@ -1380,7 +1380,7 @@ else if (nm.startsWith("0", index) && nm.length() > 1 + index) { @SideEffectFree @StaticallyExecutable @Deprecated(since="9", forRemoval = true) - public @PolyIndex @PolyValue @PolySigned Long(@PolyIndex @PolyValue @PolySigned long value) { + public @PolyIndex @PolySigned @PolyValue Long(@PolyIndex @PolySigned @PolyValue long value) { this.value = value; } @@ -1449,7 +1449,7 @@ public Long(String s) throws NumberFormatException { @Pure @StaticallyExecutable @IntrinsicCandidate - public @PolyIndex @PolyValue @PolySigned long longValue(@PolyIndex @PolyValue @PolySigned Long this) { + public @PolyIndex @PolySigned @PolyValue long longValue(@PolyIndex @PolySigned @PolyValue Long this) { return value; } diff --git a/src/java.base/share/classes/java/lang/Short.java b/src/java.base/share/classes/java/lang/Short.java index 2a20231cd045e..68271b4f9ac32 100644 --- a/src/java.base/share/classes/java/lang/Short.java +++ b/src/java.base/share/classes/java/lang/Short.java @@ -302,7 +302,7 @@ private ShortCache() {} @SideEffectFree @StaticallyExecutable @IntrinsicCandidate - public static @NewObject @PolyIndex @PolyValue @PolySigned Short valueOf(@PolyIndex @PolyValue @PolySigned short s) { + public static @NewObject @PolyIndex @PolySigned @PolyValue Short valueOf(@PolyIndex @PolySigned @PolyValue short s) { final int offset = 128; int sAsInt = s; if (sAsInt >= -128 && sAsInt <= 127) { // must cache @@ -385,7 +385,7 @@ private ShortCache() {} @SideEffectFree @StaticallyExecutable @Deprecated(since="9", forRemoval = true) - public @PolyIndex @PolyValue @PolySigned Short(@PolyIndex @PolyValue @PolySigned short value) { + public @PolyIndex @PolySigned @PolyValue Short(@PolyIndex @PolySigned @PolyValue short value) { this.value = value; } @@ -432,7 +432,7 @@ public Short(String s) throws NumberFormatException { @Pure @StaticallyExecutable @IntrinsicCandidate - public @PolyIndex @PolyValue @PolySigned short shortValue(@PolyIndex @PolyValue @PolySigned Short this) { + public @PolyIndex @PolySigned @PolyValue short shortValue(@PolyIndex @PolySigned @PolyValue Short this) { return value; } @@ -443,7 +443,7 @@ public Short(String s) throws NumberFormatException { */ @Pure @StaticallyExecutable - public @PolyIndex @PolyValue @PolySigned int intValue(@PolyIndex @PolyValue @PolySigned Short this) { + public @PolyIndex @PolySigned @PolyValue int intValue(@PolyIndex @PolySigned @PolyValue Short this) { return (int)value; } @@ -454,7 +454,7 @@ public Short(String s) throws NumberFormatException { */ @Pure @StaticallyExecutable - public @PolyIndex @PolyValue @PolySigned long longValue(@PolyIndex @PolyValue @PolySigned Short this) { + public @PolyIndex @PolySigned @PolyValue long longValue(@PolyIndex @PolySigned @PolyValue Short this) { return (long)value; } diff --git a/src/java.base/share/classes/java/lang/String.java b/src/java.base/share/classes/java/lang/String.java index c1070b62fa438..a89320f0550e7 100644 --- a/src/java.base/share/classes/java/lang/String.java +++ b/src/java.base/share/classes/java/lang/String.java @@ -45,6 +45,7 @@ import org.checkerframework.checker.regex.qual.Regex; import org.checkerframework.checker.signature.qual.PolySignature; import org.checkerframework.checker.signedness.qual.PolySigned; +import org.checkerframework.common.aliasing.qual.Unique; import org.checkerframework.common.value.qual.ArrayLen; import org.checkerframework.common.value.qual.ArrayLenRange; import org.checkerframework.common.value.qual.EnsuresMinLenIf; @@ -56,7 +57,6 @@ import org.checkerframework.dataflow.qual.SideEffectFree; import org.checkerframework.framework.qual.AnnotatedFor; import org.checkerframework.framework.qual.CFComment; -import org.checkerframework.common.aliasing.qual.Unique; import java.io.ObjectStreamField; import java.io.UnsupportedEncodingException; @@ -4603,7 +4603,7 @@ public static String copyValueOf(char data @GuardSatisfied [], @IndexOrHigh({"#1 */ @Pure @StaticallyExecutable - public native @Interned @SameLen({"this"}) @PolySignature @PolyRegex @PolyValue String intern(@PolySignature @PolyRegex @PolyValue String this); + public native @Interned @SameLen({"this"}) @PolyRegex @PolySignature @PolyValue String intern(@PolyRegex @PolySignature @PolyValue String this); /** * Returns a string whose value is the concatenation of this diff --git a/src/java.base/share/classes/java/util/Arrays.java b/src/java.base/share/classes/java/util/Arrays.java index 638fcbc1f9ae1..b9c5e762b364d 100644 --- a/src/java.base/share/classes/java/util/Arrays.java +++ b/src/java.base/share/classes/java/util/Arrays.java @@ -2994,7 +2994,7 @@ public static boolean equals(float[] a, int aFromIndex, int aToIndex, * @return {@code true} if the two arrays are equal */ @Pure - public static boolean equals(@PolyNull @PolySigned @PolyInterned Object @GuardSatisfied @Nullable [] a, @PolyNull @PolySigned @PolyInterned Object @GuardSatisfied @Nullable [] a2) { + public static boolean equals(@PolyInterned @PolyNull @PolySigned Object @GuardSatisfied @Nullable [] a, @PolyInterned @PolyNull @PolySigned Object @GuardSatisfied @Nullable [] a2) { if (a==a2) return true; if (a==null || a2==null) @@ -3454,7 +3454,7 @@ public static void fill(float[] a, @IndexOrHigh({"#1"}) int fromIndex, @IndexOrH * @throws ArrayStoreException if the specified value is not of a * runtime type that can be stored in the specified array */ - public static void fill(@PolyNull @PolySigned @PolyInterned Object[] a, @PolyNull @PolySigned @PolyInterned Object val) { + public static void fill(@PolyInterned @PolyNull @PolySigned Object[] a, @PolyInterned @PolyNull @PolySigned Object val) { for (int i = 0, len = a.length; i < len; i++) a[i] = val; } @@ -3478,7 +3478,7 @@ public static void fill(@PolyNull @PolySigned @PolyInterned Object[] a, @PolyNul * @throws ArrayStoreException if the specified value is not of a * runtime type that can be stored in the specified array */ - public static void fill(@PolyNull @PolySigned @PolyInterned Object[] a, @IndexOrHigh({"#1"}) int fromIndex, @IndexOrHigh({"#1"}) int toIndex, @PolyNull @PolySigned @PolyInterned Object val) { + public static void fill(@PolyInterned @PolyNull @PolySigned Object[] a, @IndexOrHigh({"#1"}) int fromIndex, @IndexOrHigh({"#1"}) int toIndex, @PolyInterned @PolyNull @PolySigned Object val) { rangeCheck(a.length, fromIndex, toIndex); for (int i = fromIndex; i < toIndex; i++) a[i] = val; @@ -4552,7 +4552,7 @@ public static int hashCode(double a @Nullable []) { * @since 1.5 */ @Pure - public static int hashCode(@PolyNull @PolySigned @PolyInterned Object a @GuardSatisfied @Nullable []) { + public static int hashCode(@PolyInterned @PolyNull @PolySigned Object a @GuardSatisfied @Nullable []) { if (a == null) return 0; @@ -4594,7 +4594,7 @@ public static int hashCode(@PolyNull @PolySigned @PolyInterned Object a @GuardSa * @since 1.5 */ @Pure - public static int deepHashCode(@PolyNull @PolySigned @PolyInterned Object a @GuardSatisfied @Nullable []) { + public static int deepHashCode(@PolyInterned @PolyNull @PolySigned Object a @GuardSatisfied @Nullable []) { if (a == null) return 0; @@ -4668,7 +4668,7 @@ private static int primitiveArrayHashCode(Object a, Class cl) { * @since 1.5 */ @Pure - public static boolean deepEquals(@PolyNull @PolySigned @PolyInterned Object @GuardSatisfied @Nullable [] a1, @PolyNull @PolySigned @PolyInterned Object @GuardSatisfied @Nullable [] a2) { + public static boolean deepEquals(@PolyInterned @PolyNull @PolySigned Object @GuardSatisfied @Nullable [] a1, @PolyInterned @PolyNull @PolySigned Object @GuardSatisfied @Nullable [] a2) { if (a1 == a2) return true; if (a1 == null || a2==null) @@ -4990,7 +4990,7 @@ else if (e1 instanceof boolean[] && e2 instanceof boolean[]) @CFComment({"The @PolyMustCall annotations don't make sense, because toString", "shouldn't care about MustCall types, especially of the array. However,", "without these annotations, calls to Arrays.toString yield a MustCall error."}) - public static @MinLen(2) String toString(@PolyMustCall @PolyNull @PolySigned @PolyInterned Object @PolyMustCall @Nullable [] a) { + public static @MinLen(2) String toString(@PolyInterned @PolyMustCall @PolyNull @PolySigned Object @PolyMustCall @Nullable [] a) { if (a == null) return "null"; @@ -5042,7 +5042,7 @@ else if (e1 instanceof boolean[] && e2 instanceof boolean[]) * @since 1.5 */ @SideEffectFree - public static @MinLen(2) String deepToString(@PolyMustCall @PolyNull @PolySigned @PolyInterned Object @PolyMustCall @Nullable [] a) { + public static @MinLen(2) String deepToString(@PolyInterned @PolyMustCall @PolyNull @PolySigned Object @PolyMustCall @Nullable [] a) { if (a == null) return "null"; From 48353d91ba6e9790f1c17f3fc4ee4f5d72c49a3a Mon Sep 17 00:00:00 2001 From: Mark Roberts Date: Thu, 6 Jul 2023 08:07:35 -0700 Subject: [PATCH 14/50] have toArray annotations match superclass Collection --- src/java.base/share/classes/java/util/List.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/java/util/List.java b/src/java.base/share/classes/java/util/List.java index e414723de3580..b91f3d519ecae 100644 --- a/src/java.base/share/classes/java/util/List.java +++ b/src/java.base/share/classes/java/util/List.java @@ -33,6 +33,7 @@ import org.checkerframework.checker.lock.qual.ReleasesNoLocks; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.PolyNull; +import org.checkerframework.checker.signedness.qual.PolySigned; import org.checkerframework.checker.signedness.qual.UnknownSignedness; import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.dataflow.qual.SideEffectFree; @@ -219,7 +220,7 @@ public interface List extends Collection { * @see Arrays#asList(Object[]) */ @SideEffectFree - @PolyNull Object[] toArray(List<@PolyNull E> this); + @PolyNull @PolySigned Object[] toArray(List<@PolyNull @PolySigned E> this); /** * Returns an array containing all of the elements in this list in @@ -261,7 +262,7 @@ public interface List extends Collection { * @throws NullPointerException if the specified array is null */ @SideEffectFree - @Nullable T[] toArray(@PolyNull T[] a); + @Nullable T[] toArray(@PolyNull T[] a); // Modification Operations From aeb6587a15c68a5e08955b86e74cb7f764e6ddf7 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Wed, 12 Jul 2023 12:41:27 -0400 Subject: [PATCH 15/50] Use `@PolyNull` in `ConcurrentMap.getOrDefault` (but still not plain `Map`). (#44) Co-authored-by: Werner Dietl --- src/java.base/share/classes/java/util/Hashtable.java | 2 +- src/java.base/share/classes/java/util/Map.java | 3 +++ src/java.base/share/classes/java/util/Properties.java | 2 +- .../share/classes/java/util/concurrent/ConcurrentHashMap.java | 2 +- .../share/classes/java/util/concurrent/ConcurrentMap.java | 2 +- .../classes/java/util/concurrent/ConcurrentSkipListMap.java | 2 +- 6 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/java.base/share/classes/java/util/Hashtable.java b/src/java.base/share/classes/java/util/Hashtable.java index 65fddafb6bdee..10afd275d0906 100644 --- a/src/java.base/share/classes/java/util/Hashtable.java +++ b/src/java.base/share/classes/java/util/Hashtable.java @@ -917,7 +917,7 @@ public synchronized int hashCode(@GuardSatisfied Hashtable this) { @Override @Pure - public synchronized V getOrDefault(@GuardSatisfied @UnknownSignedness Object key, V defaultValue) { + public synchronized @PolyNull V getOrDefault(@GuardSatisfied @UnknownSignedness Object key, @PolyNull V defaultValue) { V result = get(key); return (null == result) ? defaultValue : result; } diff --git a/src/java.base/share/classes/java/util/Map.java b/src/java.base/share/classes/java/util/Map.java index 311b45adff588..cc1e3efdc4b8e 100644 --- a/src/java.base/share/classes/java/util/Map.java +++ b/src/java.base/share/classes/java/util/Map.java @@ -707,6 +707,9 @@ public static Map.Entry copyOf(Map.Entry * @since 1.8 */ @Pure + @CFComment("nullness: We can't use @PolyNull V because the output can be null even when" + + " defaultValue is not (namely, when the map contains a null value). " + + "Map subclasses that forbid null values can use @PolyNull V.") default V getOrDefault(@GuardSatisfied @UnknownSignedness Object key, V defaultValue) { V v; return (((v = get(key)) != null) || containsKey(key)) diff --git a/src/java.base/share/classes/java/util/Properties.java b/src/java.base/share/classes/java/util/Properties.java index 55d2cea89df17..f1d1b08f7d7db 100644 --- a/src/java.base/share/classes/java/util/Properties.java +++ b/src/java.base/share/classes/java/util/Properties.java @@ -1434,7 +1434,7 @@ public synchronized int hashCode() { @Override @Pure - public Object getOrDefault(@GuardSatisfied @Nullable @UnknownSignedness Object key, Object defaultValue) { + public @PolyNull Object getOrDefault(@GuardSatisfied @Nullable @UnknownSignedness Object key, @PolyNull Object defaultValue) { return map.getOrDefault(key, defaultValue); } diff --git a/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java b/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java index 0c27aab1361be..396fed87de7f1 100644 --- a/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java +++ b/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java @@ -1618,7 +1618,7 @@ public boolean replace(K key, V oldValue, V newValue) { * @throws NullPointerException if the specified key is null */ @Pure - public V getOrDefault(@GuardSatisfied @UnknownSignedness Object key, V defaultValue) { + public @PolyNull V getOrDefault(@GuardSatisfied @UnknownSignedness Object key, @PolyNull V defaultValue) { V v; return (v = get(key)) == null ? defaultValue : v; } diff --git a/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java b/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java index 345f185dc902a..6726489e1fb42 100644 --- a/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java +++ b/src/java.base/share/classes/java/util/concurrent/ConcurrentMap.java @@ -93,7 +93,7 @@ public interface ConcurrentMap Date: Wed, 12 Jul 2023 12:43:20 -0400 Subject: [PATCH 16/50] Improve annotations on `PriorityQueue`. (#49) --- src/java.base/share/classes/java/util/PriorityQueue.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/java/util/PriorityQueue.java b/src/java.base/share/classes/java/util/PriorityQueue.java index f47b0cfe69f54..03476aad28ab3 100644 --- a/src/java.base/share/classes/java/util/PriorityQueue.java +++ b/src/java.base/share/classes/java/util/PriorityQueue.java @@ -166,7 +166,7 @@ public PriorityQueue(@Positive int initialCapacity) { * natural ordering} of the elements will be used. * @since 1.8 */ - public PriorityQueue(Comparator comparator) { + public PriorityQueue(@Nullable Comparator comparator) { this(DEFAULT_INITIAL_CAPACITY, comparator); } @@ -182,7 +182,7 @@ public PriorityQueue(Comparator comparator) { * less than 1 */ public PriorityQueue(@Positive int initialCapacity, - Comparator comparator) { + @Nullable Comparator comparator) { // Note: This restriction of at least one is not actually needed, // but continues for 1.5 compatibility if (initialCapacity < 1) @@ -425,7 +425,7 @@ public boolean contains(@GuardSatisfied PriorityQueue this, @GuardSatisfied @ * @return an array containing all of the elements in this queue */ @SideEffectFree - public @PolyNull @PolySigned Object[] toArray(PriorityQueue<@PolyNull @PolySigned E> this) { + public @PolySigned Object[] toArray(PriorityQueue<@PolySigned E> this) { return Arrays.copyOf(queue, size); } From a40ff8a37eb98644514b644971f115ffd717d721 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Wed, 12 Jul 2023 12:45:15 -0400 Subject: [PATCH 17/50] Improve annotations in `PriorityBlockingQueue`. (#50) --- .../classes/java/util/concurrent/PriorityBlockingQueue.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java b/src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java index 420cae708ee5c..886b21717931d 100644 --- a/src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java +++ b/src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java @@ -226,7 +226,7 @@ public PriorityBlockingQueue(int initialCapacity) { * than 1 */ public PriorityBlockingQueue(int initialCapacity, - Comparator comparator) { + @Nullable Comparator comparator) { if (initialCapacity < 1) throw new IllegalArgumentException(); this.comparator = comparator; @@ -582,7 +582,7 @@ public E take() throws InterruptedException { * or {@code null} if this queue uses the natural * ordering of its elements */ - public Comparator comparator() { + public @Nullable Comparator comparator() { return comparator; } @@ -777,7 +777,7 @@ public void clear() { * * @return an array containing all of the elements in this queue */ - public @PolyNull @PolySigned Object[] toArray(PriorityBlockingQueue<@PolyNull @PolySigned E> this) { + public @PolySigned Object[] toArray(PriorityBlockingQueue<@PolySigned E> this) { final ReentrantLock lock = this.lock; lock.lock(); try { From 4d3d99734c3000363de9e52feda0ec898887a923 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Wed, 19 Jul 2023 13:03:42 -0400 Subject: [PATCH 18/50] Annotate `ConcurrentSkipListMap` for nullness. (#51) --- .../concurrent/ConcurrentSkipListMap.java | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java b/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java index 0e19c326435cd..e4bc7bfeb7e14 100644 --- a/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java +++ b/src/java.base/share/classes/java/util/concurrent/ConcurrentSkipListMap.java @@ -44,6 +44,7 @@ import org.checkerframework.checker.signedness.qual.UnknownSignedness; import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.dataflow.qual.SideEffectFree; +import org.checkerframework.framework.qual.AnnotatedFor; import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; @@ -119,6 +120,7 @@ * @param the type of mapped values * @since 1.6 */ +@AnnotatedFor({"nullness"}) public class ConcurrentSkipListMap extends AbstractMap implements ConcurrentNavigableMap, Cloneable, Serializable { /* @@ -1091,7 +1093,7 @@ public ConcurrentSkipListMap() { * If {@code null}, the {@linkplain Comparable natural * ordering} of the keys will be used. */ - public ConcurrentSkipListMap(Comparator comparator) { + public ConcurrentSkipListMap(@Nullable Comparator comparator) { this.comparator = comparator; } @@ -1319,7 +1321,7 @@ public boolean containsKey(@GuardSatisfied @UnknownSignedness Object key) { * with the keys currently in the map * @throws NullPointerException if the specified key is null */ - public V get(Object key) { + public @Nullable V get(Object key) { return doGet(key); } @@ -1353,7 +1355,7 @@ public V get(Object key) { * with the keys currently in the map * @throws NullPointerException if the specified key or value is null */ - public V put(K key, V value) { + public @Nullable V put(K key, V value) { if (value == null) throw new NullPointerException(); return doPut(key, value, false); @@ -1369,7 +1371,7 @@ public V put(K key, V value) { * with the keys currently in the map * @throws NullPointerException if the specified key is null */ - public V remove(@GuardSatisfied @UnknownSignedness Object key) { + public @Nullable V remove(@GuardSatisfied @UnknownSignedness Object key) { return doRemove(key, null); } @@ -1525,7 +1527,7 @@ else if (doRemove(key, v) != null) * @since 1.8 */ public @PolyNull V compute(K key, - BiFunction remappingFunction) { + BiFunction remappingFunction) { if (key == null || remappingFunction == null) throw new NullPointerException(); for (;;) { @@ -1802,7 +1804,7 @@ public boolean equals(@Nullable Object o) { * with the keys currently in the map * @throws NullPointerException if the specified key or value is null */ - public V putIfAbsent(K key, V value) { + public @Nullable V putIfAbsent(K key, V value) { if (value == null) throw new NullPointerException(); return doPut(key, value, true); @@ -1853,7 +1855,7 @@ public boolean replace(K key, V oldValue, V newValue) { * with the keys currently in the map * @throws NullPointerException if the specified key or value is null */ - public V replace(K key, V value) { + public @Nullable V replace(K key, V value) { if (key == null || value == null) throw new NullPointerException(); for (;;) { @@ -1867,7 +1869,7 @@ public V replace(K key, V value) { /* ------ SortedMap API methods ------ */ - public Comparator comparator() { + public @Nullable Comparator comparator() { return comparator; } @@ -1976,7 +1978,7 @@ public ConcurrentNavigableMap tailMap(K fromKey) { * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if the specified key is null */ - public Map.Entry lowerEntry(K key) { + public Map.@Nullable Entry lowerEntry(K key) { return findNearEntry(key, LT, comparator); } @@ -1984,7 +1986,7 @@ public Map.Entry lowerEntry(K key) { * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if the specified key is null */ - public K lowerKey(K key) { + public @Nullable K lowerKey(K key) { Node n = findNear(key, LT, comparator); return (n == null) ? null : n.key; } @@ -1999,7 +2001,7 @@ public K lowerKey(K key) { * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if the specified key is null */ - public Map.Entry floorEntry(K key) { + public Map.@Nullable Entry floorEntry(K key) { return findNearEntry(key, LT|EQ, comparator); } @@ -2008,7 +2010,7 @@ public Map.Entry floorEntry(K key) { * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if the specified key is null */ - public K floorKey(K key) { + public @Nullable K floorKey(K key) { Node n = findNear(key, LT|EQ, comparator); return (n == null) ? null : n.key; } @@ -2022,7 +2024,7 @@ public K floorKey(K key) { * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if the specified key is null */ - public Map.Entry ceilingEntry(K key) { + public Map.@Nullable Entry ceilingEntry(K key) { return findNearEntry(key, GT|EQ, comparator); } @@ -2030,7 +2032,7 @@ public Map.Entry ceilingEntry(K key) { * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if the specified key is null */ - public K ceilingKey(K key) { + public @Nullable K ceilingKey(K key) { Node n = findNear(key, GT|EQ, comparator); return (n == null) ? null : n.key; } @@ -2045,7 +2047,7 @@ public K ceilingKey(K key) { * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if the specified key is null */ - public Map.Entry higherEntry(K key) { + public Map.@Nullable Entry higherEntry(K key) { return findNearEntry(key, GT, comparator); } @@ -2054,7 +2056,7 @@ public Map.Entry higherEntry(K key) { * @throws ClassCastException {@inheritDoc} * @throws NullPointerException if the specified key is null */ - public K higherKey(K key) { + public @Nullable K higherKey(K key) { Node n = findNear(key, GT, comparator); return (n == null) ? null : n.key; } @@ -2065,7 +2067,7 @@ public K higherKey(K key) { * The returned entry does not support * the {@code Entry.setValue} method. */ - public Map.Entry firstEntry() { + public Map.@Nullable Entry firstEntry() { return findFirstEntry(); } @@ -2075,7 +2077,7 @@ public Map.Entry firstEntry() { * The returned entry does not support * the {@code Entry.setValue} method. */ - public Map.Entry lastEntry() { + public Map.@Nullable Entry lastEntry() { return findLastEntry(); } @@ -2085,7 +2087,7 @@ public Map.Entry lastEntry() { * The returned entry does not support * the {@code Entry.setValue} method. */ - public Map.Entry pollFirstEntry() { + public Map.@Nullable Entry pollFirstEntry() { return doRemoveFirstEntry(); } @@ -2095,7 +2097,7 @@ public Map.Entry pollFirstEntry() { * The returned entry does not support * the {@code Entry.setValue} method. */ - public Map.Entry pollLastEntry() { + public Map.@Nullable Entry pollLastEntry() { return doRemoveLastEntry(); } From ccdfdd4474065cf66496fce74e757aae851be1f6 Mon Sep 17 00:00:00 2001 From: Adam Gent Date: Wed, 16 Aug 2023 21:15:13 -0400 Subject: [PATCH 19/50] Stream ofNullable has Nullable parameter --- .../share/classes/java/util/stream/Stream.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/java.base/share/classes/java/util/stream/Stream.java b/src/java.base/share/classes/java/util/stream/Stream.java index 80b1c097d633d..fe32b88f980f3 100644 --- a/src/java.base/share/classes/java/util/stream/Stream.java +++ b/src/java.base/share/classes/java/util/stream/Stream.java @@ -25,6 +25,7 @@ package java.util.stream; import org.checkerframework.checker.lock.qual.GuardSatisfied; +import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.PolyNull; import org.checkerframework.dataflow.qual.SideEffectFree; import org.checkerframework.framework.qual.AnnotatedFor; @@ -287,7 +288,7 @@ public interface Stream extends BaseStream> { * @return the new stream * @see #mapMulti */ - Stream flatMap(Function> mapper); + Stream flatMap(Function> mapper); /** * Returns an {@code IntStream} consisting of the results of replacing each @@ -307,7 +308,7 @@ public interface Stream extends BaseStream> { * @return the new stream * @see #flatMap(Function) */ - IntStream flatMapToInt(Function mapper); + IntStream flatMapToInt(Function mapper); /** * Returns an {@code LongStream} consisting of the results of replacing each @@ -327,7 +328,7 @@ public interface Stream extends BaseStream> { * @return the new stream * @see #flatMap(Function) */ - LongStream flatMapToLong(Function mapper); + LongStream flatMapToLong(Function mapper); /** * Returns an {@code DoubleStream} consisting of the results of replacing @@ -347,7 +348,7 @@ public interface Stream extends BaseStream> { * @return the new stream * @see #flatMap(Function) */ - DoubleStream flatMapToDouble(Function mapper); + DoubleStream flatMapToDouble(Function mapper); // THE EXAMPLES USED IN THE JAVADOC MUST BE IN SYNC WITH THEIR CORRESPONDING // TEST IN test/jdk/java/util/stream/examples/JavadocExamples.java. @@ -1419,7 +1420,7 @@ public static Stream of(T t) { * is non-null, otherwise an empty stream * @since 9 */ - public static Stream ofNullable(T t) { + public static Stream ofNullable(@Nullable T t) { return t == null ? Stream.empty() : StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false); } From 4bec9066141650106f55761abfd7d13d743320ef Mon Sep 17 00:00:00 2001 From: Michael Ernst Date: Wed, 23 Aug 2023 11:30:54 -0700 Subject: [PATCH 20/50] Signedness annotations --- src/java.base/share/classes/java/lang/Class.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/java.base/share/classes/java/lang/Class.java b/src/java.base/share/classes/java/lang/Class.java index 8c5921f46a6e6..1f27cf8e5f391 100644 --- a/src/java.base/share/classes/java/lang/Class.java +++ b/src/java.base/share/classes/java/lang/Class.java @@ -36,6 +36,7 @@ import org.checkerframework.checker.signature.qual.ClassGetName; import org.checkerframework.checker.signature.qual.ClassGetSimpleName; import org.checkerframework.checker.signature.qual.DotSeparatedIdentifiers; +import org.checkerframework.checker.signedness.qual.Signed; import org.checkerframework.common.reflection.qual.ForName; import org.checkerframework.common.reflection.qual.GetConstructor; import org.checkerframework.common.reflection.qual.GetMethod; @@ -3947,7 +3948,7 @@ public Void run() { */ @SuppressWarnings("unchecked") @IntrinsicCandidate - public @PolyNull T cast(@PolyNull Object obj) { + public @PolyNull @Signed T cast(@PolyNull Object obj) { if (obj != null && !isInstance(obj)) throw new ClassCastException(cannotCastMsg(obj)); return (T) obj; From 3272c8497ba4c364c49c253095423d495207a6a6 Mon Sep 17 00:00:00 2001 From: Suzanne Millstein Date: Mon, 28 Aug 2023 10:08:02 -0700 Subject: [PATCH 21/50] Add annotations to Enums --- src/java.base/share/classes/java/lang/Enum.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/java/lang/Enum.java b/src/java.base/share/classes/java/lang/Enum.java index 0892666a6f079..3814d663147eb 100644 --- a/src/java.base/share/classes/java/lang/Enum.java +++ b/src/java.base/share/classes/java/lang/Enum.java @@ -27,13 +27,16 @@ import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.initialization.qual.UnknownInitialization; +import org.checkerframework.checker.nullness.qual.UnknownKeyFor; import org.checkerframework.checker.lock.qual.GuardSatisfied; import org.checkerframework.checker.lock.qual.GuardedByUnknown; import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.tainting.qual.Tainted; import org.checkerframework.common.value.qual.PolyValue; import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.dataflow.qual.SideEffectFree; import org.checkerframework.framework.qual.AnnotatedFor; +import org.checkerframework.framework.qual.Covariant; import java.io.IOException; import java.io.InvalidObjectException; @@ -80,7 +83,8 @@ * @jls 8.9.3 Enum Members * @since 1.5 */ -@AnnotatedFor({"lock", "nullness", "index", "value"}) +@AnnotatedFor({"lock", "nullness", "index", "value", "tainting"}) +@Covariant(0) @SuppressWarnings("serial") // No serialVersionUID needed due to // special-casing of enum classes. public abstract class Enum> @@ -208,7 +212,7 @@ protected final Object clone(@GuardSatisfied Enum this) throws CloneNotSuppor * method is the order in which the constants are declared. */ @SuppressWarnings({"rawtypes"}) - public final int compareTo(E o) { + public final int compareTo(@UnknownKeyFor @Tainted E o) { Enum other = (Enum)o; Enum self = this; if (self.getClass() != other.getClass() && // optimization @@ -230,7 +234,7 @@ public final int compareTo(E o) { * enum type */ @SuppressWarnings("unchecked") - public final Class getDeclaringClass() { + public final Class<@Tainted E> getDeclaringClass() { Class clazz = getClass(); Class zuper = clazz.getSuperclass(); return (zuper == Enum.class) ? (Class)clazz : (Class)zuper; From e2d6e220f52fcdde698363d622433bcbfef71de7 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Wed, 6 Sep 2023 11:41:15 -0400 Subject: [PATCH 22/50] Permit a null `password` in `KeyStore.getKey`. (#53) --- src/java.base/share/classes/java/security/KeyStore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java.base/share/classes/java/security/KeyStore.java b/src/java.base/share/classes/java/security/KeyStore.java index f0df629bacd49..e603e07eb06d2 100644 --- a/src/java.base/share/classes/java/security/KeyStore.java +++ b/src/java.base/share/classes/java/security/KeyStore.java @@ -1046,7 +1046,7 @@ public final String getType() * @throws UnrecoverableKeyException if the key cannot be recovered * (e.g., the given password is wrong). */ - public final @Nullable Key getKey(String alias, char[] password) + public final @Nullable Key getKey(String alias, char @Nullable [] password) throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException { From 55fe1cdc7fc7b94b555a73dc08a07e758fbc6278 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Wed, 6 Sep 2023 11:53:43 -0400 Subject: [PATCH 23/50] Annotate the `arg` parameter of `Observer.update` as `@Nullable`. (#54) --- src/java.base/share/classes/java/util/Observer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/java.base/share/classes/java/util/Observer.java b/src/java.base/share/classes/java/util/Observer.java index 36abc4addd154..7a3420161563a 100644 --- a/src/java.base/share/classes/java/util/Observer.java +++ b/src/java.base/share/classes/java/util/Observer.java @@ -24,6 +24,7 @@ */ package java.util; +import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.framework.qual.AnnotatedFor; import org.checkerframework.framework.qual.CFComment; @@ -57,5 +58,5 @@ public interface Observer { * @param arg an argument passed to the {@code notifyObservers} * method. */ - void update(Observable o, Object arg); + void update(Observable o, @Nullable Object arg); } From dca7dd66817ca2e7389cc790150f58127509cb3d Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Wed, 6 Sep 2023 11:55:22 -0400 Subject: [PATCH 24/50] Make `enumerate` accept `@PolyNull Thread[]` (ditto `ThreadGroup`). (#55) --- src/java.base/share/classes/java/lang/ThreadGroup.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/java.base/share/classes/java/lang/ThreadGroup.java b/src/java.base/share/classes/java/lang/ThreadGroup.java index 9f756c151e67c..77eb30d6fad5d 100644 --- a/src/java.base/share/classes/java/lang/ThreadGroup.java +++ b/src/java.base/share/classes/java/lang/ThreadGroup.java @@ -30,6 +30,7 @@ import org.checkerframework.checker.interning.qual.UsesObjectEquals; import org.checkerframework.checker.lock.qual.GuardSatisfied; import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.nullness.qual.PolyNull; import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.dataflow.qual.SideEffectFree; import org.checkerframework.framework.qual.AnnotatedFor; @@ -418,7 +419,7 @@ public final void checkAccess() { * * @since 1.0 */ - public @NonNegative int enumerate(Thread list[]) { + public @NonNegative int enumerate(@PolyNull Thread[] list) { checkAccess(); return enumerate(list, 0, true); } @@ -456,7 +457,7 @@ public final void checkAccess() { * * @since 1.0 */ - public @NonNegative int enumerate(Thread list[], boolean recurse) { + public @NonNegative int enumerate(@PolyNull Thread[] list, boolean recurse) { checkAccess(); return enumerate(list, 0, recurse); } @@ -560,7 +561,7 @@ public final void checkAccess() { * * @since 1.0 */ - public @NonNegative int enumerate(ThreadGroup list[]) { + public @NonNegative int enumerate(@PolyNull ThreadGroup[] list) { checkAccess(); return enumerate(list, 0, true); } @@ -598,7 +599,7 @@ public final void checkAccess() { * * @since 1.0 */ - public @NonNegative int enumerate(ThreadGroup list[], boolean recurse) { + public @NonNegative int enumerate(@PolyNull ThreadGroup[] list, boolean recurse) { checkAccess(); return enumerate(list, 0, recurse); } From 81d2dde341c4651b1cf3b6277d51e6a6616867a2 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Wed, 6 Sep 2023 12:07:41 -0400 Subject: [PATCH 25/50] Annotate `java.util.Properties` better (and `Hashtable` a little, too). (#56) --- .../share/classes/java/util/Hashtable.java | 4 ++-- .../share/classes/java/util/Properties.java | 20 +++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/java.base/share/classes/java/util/Hashtable.java b/src/java.base/share/classes/java/util/Hashtable.java index 10afd275d0906..4473d5395eccc 100644 --- a/src/java.base/share/classes/java/util/Hashtable.java +++ b/src/java.base/share/classes/java/util/Hashtable.java @@ -965,7 +965,7 @@ public synchronized void replaceAll(BiFunction tab[] = table; int hash = key.hashCode(); diff --git a/src/java.base/share/classes/java/util/Properties.java b/src/java.base/share/classes/java/util/Properties.java index f1d1b08f7d7db..203151533f2a3 100644 --- a/src/java.base/share/classes/java/util/Properties.java +++ b/src/java.base/share/classes/java/util/Properties.java @@ -166,7 +166,7 @@ public class Properties extends Hashtable { * * @serial */ - protected volatile Properties defaults; + protected volatile @Nullable Properties defaults; /** * Properties does not store values in its inherited Hashtable, but instead @@ -208,7 +208,7 @@ public Properties(int initialCapacity) { * * @param defaults the defaults. */ - public Properties(Properties defaults) { + public Properties(@Nullable Properties defaults) { this(defaults, 8); } @@ -1310,22 +1310,22 @@ public boolean containsKey(@GuardSatisfied @Nullable @UnknownSignedness Object k } @Override - public Object get(Object key) { + public @Nullable Object get(Object key) { return map.get(key); } @Override - public synchronized Object put(Object key, Object value) { + public synchronized @Nullable Object put(Object key, Object value) { return map.put(key, value); } @Override - public synchronized Object remove(@GuardSatisfied @Nullable @UnknownSignedness Object key) { + public synchronized @Nullable Object remove(@GuardSatisfied @UnknownSignedness Object key) { return map.remove(key); } @Override - public synchronized void putAll(Map t) { + public synchronized void putAll(Map t) { map.putAll(t); } @@ -1434,7 +1434,7 @@ public synchronized int hashCode() { @Override @Pure - public @PolyNull Object getOrDefault(@GuardSatisfied @Nullable @UnknownSignedness Object key, @PolyNull Object defaultValue) { + public @PolyNull Object getOrDefault(@GuardSatisfied @UnknownSignedness Object key, @PolyNull Object defaultValue) { return map.getOrDefault(key, defaultValue); } @@ -1444,12 +1444,12 @@ public synchronized void forEach(BiConsumer acti } @Override - public synchronized void replaceAll(BiFunction function) { + public synchronized void replaceAll(BiFunction function) { map.replaceAll(function); } @Override - public synchronized Object putIfAbsent(Object key, Object value) { + public synchronized @Nullable Object putIfAbsent(Object key, Object value) { return map.putIfAbsent(key, value); } @@ -1464,7 +1464,7 @@ public synchronized boolean replace(Object key, Object oldValue, Object newValue } @Override - public synchronized Object replace(Object key, Object value) { + public synchronized @Nullable Object replace(Object key, Object value) { return map.replace(key, value); } From 9674c43d4f57f883b656cbb22759fb67ea3ca8e3 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Wed, 6 Sep 2023 12:09:08 -0400 Subject: [PATCH 26/50] Finish annotating the concurrent queues. (#57) --- .../java/util/concurrent/ArrayBlockingQueue.java | 6 +++--- .../java/util/concurrent/LinkedTransferQueue.java | 10 ++++++---- .../classes/java/util/concurrent/SynchronousQueue.java | 6 +++--- .../classes/java/util/concurrent/TransferQueue.java | 5 ++++- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/java.base/share/classes/java/util/concurrent/ArrayBlockingQueue.java b/src/java.base/share/classes/java/util/concurrent/ArrayBlockingQueue.java index 6a57342bf63e0..9123c1e8e280d 100644 --- a/src/java.base/share/classes/java/util/concurrent/ArrayBlockingQueue.java +++ b/src/java.base/share/classes/java/util/concurrent/ArrayBlockingQueue.java @@ -412,7 +412,7 @@ public boolean offer(E e, long timeout, TimeUnit unit) } } - public E poll() { + public @Nullable E poll() { final ReentrantLock lock = this.lock; lock.lock(); try { @@ -434,7 +434,7 @@ public E take() throws InterruptedException { } } - public E poll(long timeout, TimeUnit unit) throws InterruptedException { + public @Nullable E poll(long timeout, TimeUnit unit) throws InterruptedException { long nanos = unit.toNanos(timeout); final ReentrantLock lock = this.lock; lock.lockInterruptibly(); @@ -450,7 +450,7 @@ public E poll(long timeout, TimeUnit unit) throws InterruptedException { } } - public E peek() { + public @Nullable E peek() { final ReentrantLock lock = this.lock; lock.lock(); try { diff --git a/src/java.base/share/classes/java/util/concurrent/LinkedTransferQueue.java b/src/java.base/share/classes/java/util/concurrent/LinkedTransferQueue.java index a3368c7557ba5..4771ca2555b92 100644 --- a/src/java.base/share/classes/java/util/concurrent/LinkedTransferQueue.java +++ b/src/java.base/share/classes/java/util/concurrent/LinkedTransferQueue.java @@ -42,6 +42,7 @@ import org.checkerframework.checker.signedness.qual.PolySigned; import org.checkerframework.checker.signedness.qual.UnknownSignedness; import org.checkerframework.dataflow.qual.Pure; +import org.checkerframework.framework.qual.AnnotatedFor; import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; @@ -96,7 +97,8 @@ * @author Doug Lea * @param the type of elements held in this queue */ -public class LinkedTransferQueue extends AbstractQueue +@AnnotatedFor("nullness") +public class LinkedTransferQueue extends AbstractQueue implements TransferQueue, java.io.Serializable { private static final long serialVersionUID = -3223113410248163686L; @@ -1298,14 +1300,14 @@ public E take() throws InterruptedException { throw new InterruptedException(); } - public E poll(long timeout, TimeUnit unit) throws InterruptedException { + public @Nullable E poll(long timeout, TimeUnit unit) throws InterruptedException { E e = xfer(null, false, TIMED, unit.toNanos(timeout)); if (e != null || !Thread.interrupted()) return e; throw new InterruptedException(); } - public E poll() { + public @Nullable E poll() { return xfer(null, false, NOW, 0L); } @@ -1350,7 +1352,7 @@ public Iterator iterator() { return new Itr(); } - public E peek() { + public @Nullable E peek() { restartFromHead: for (;;) { for (Node p = head; p != null;) { Object item = p.item; diff --git a/src/java.base/share/classes/java/util/concurrent/SynchronousQueue.java b/src/java.base/share/classes/java/util/concurrent/SynchronousQueue.java index d9f3391e35e01..b59c71082e2a8 100644 --- a/src/java.base/share/classes/java/util/concurrent/SynchronousQueue.java +++ b/src/java.base/share/classes/java/util/concurrent/SynchronousQueue.java @@ -910,7 +910,7 @@ public E take() throws InterruptedException { * specified waiting time elapses before an element is present * @throws InterruptedException {@inheritDoc} */ - public E poll(long timeout, TimeUnit unit) throws InterruptedException { + public @Nullable E poll(long timeout, TimeUnit unit) throws InterruptedException { E e = transferer.transfer(null, true, unit.toNanos(timeout)); if (e != null || !Thread.interrupted()) return e; @@ -924,7 +924,7 @@ public E poll(long timeout, TimeUnit unit) throws InterruptedException { * @return the head of this queue, or {@code null} if no * element is available */ - public E poll() { + public @Nullable E poll() { return transferer.transfer(null, true, 0); } @@ -1031,7 +1031,7 @@ public boolean retainAll(Collection c) { * * @return {@code null} */ - public E peek() { + public @Nullable E peek() { return null; } diff --git a/src/java.base/share/classes/java/util/concurrent/TransferQueue.java b/src/java.base/share/classes/java/util/concurrent/TransferQueue.java index 72a4108e61b89..846d2818b5d37 100644 --- a/src/java.base/share/classes/java/util/concurrent/TransferQueue.java +++ b/src/java.base/share/classes/java/util/concurrent/TransferQueue.java @@ -35,6 +35,8 @@ package java.util.concurrent; +import org.checkerframework.framework.qual.AnnotatedFor; + /** * A {@link BlockingQueue} in which producers may wait for consumers * to receive elements. A {@code TransferQueue} may be useful for @@ -65,7 +67,8 @@ * @author Doug Lea * @param the type of elements held in this queue */ -public interface TransferQueue extends BlockingQueue { +@AnnotatedFor("nullness") +public interface TransferQueue extends BlockingQueue { /** * Transfers the element to a waiting consumer immediately, if possible. * From dbd1c7775f93f7fabdba7be8a1a5cc08a6185ae8 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Wed, 6 Sep 2023 12:10:59 -0400 Subject: [PATCH 27/50] Add missing `@Nullable` annotations in `ReferenceQueue`. (#35) (#58) --- .../share/classes/java/lang/ref/ReferenceQueue.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/java/lang/ref/ReferenceQueue.java b/src/java.base/share/classes/java/lang/ref/ReferenceQueue.java index d32a486dabeb1..87038d21c1860 100644 --- a/src/java.base/share/classes/java/lang/ref/ReferenceQueue.java +++ b/src/java.base/share/classes/java/lang/ref/ReferenceQueue.java @@ -26,6 +26,7 @@ package java.lang.ref; import org.checkerframework.checker.interning.qual.UsesObjectEquals; +import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.framework.qual.AnnotatedFor; import java.util.function.Consumer; @@ -120,7 +121,7 @@ private Reference reallyPoll() { /* Must hold lock */ * @return A reference object, if one was immediately available, * otherwise {@code null} */ - public Reference poll() { + public @Nullable Reference poll() { if (head == null) return null; synchronized (lock) { @@ -148,7 +149,7 @@ public Reference poll() { * @throws InterruptedException * If the timeout wait is interrupted */ - public Reference remove(long timeout) + public @Nullable Reference remove(long timeout) throws IllegalArgumentException, InterruptedException { if (timeout < 0) { From 2ea2bba1eb05800b780ab205b45f7194ce129d09 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Wed, 6 Sep 2023 12:12:44 -0400 Subject: [PATCH 28/50] Make `KeyStore.setKeyEntry` allow a null `password` and `chain`. (#59) --- src/java.base/share/classes/java/security/KeyStore.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/java/security/KeyStore.java b/src/java.base/share/classes/java/security/KeyStore.java index e603e07eb06d2..6b26125250577 100644 --- a/src/java.base/share/classes/java/security/KeyStore.java +++ b/src/java.base/share/classes/java/security/KeyStore.java @@ -1157,8 +1157,8 @@ public final String getType() * (loaded), the given key cannot be protected, or this operation fails * for some other reason */ - public final void setKeyEntry(String alias, Key key, char[] password, - Certificate[] chain) + public final void setKeyEntry(String alias, Key key, char @Nullable [] password, + Certificate @Nullable [] chain) throws KeyStoreException { if (!initialized) { @@ -1198,7 +1198,7 @@ public final void setKeyEntry(String alias, Key key, char[] password, * (loaded), or if this operation fails for some other reason. */ public final void setKeyEntry(String alias, byte[] key, - Certificate[] chain) + Certificate @Nullable [] chain) throws KeyStoreException { if (!initialized) { From 6206589fbb97eafe45529a056cc51f2467d89e23 Mon Sep 17 00:00:00 2001 From: Werner Dietl Date: Fri, 8 Sep 2023 03:47:26 -0400 Subject: [PATCH 29/50] Update Nullable annotations in `URI.java` (#63) Co-authored-by: Mattias Ulbrich --- src/java.base/share/classes/java/net/URI.java | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/java.base/share/classes/java/net/URI.java b/src/java.base/share/classes/java/net/URI.java index 23c822a0c3278..9a1baed18ee26 100644 --- a/src/java.base/share/classes/java/net/URI.java +++ b/src/java.base/share/classes/java/net/URI.java @@ -30,6 +30,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.dataflow.qual.SideEffectFree; +import org.checkerframework.framework.qual.AnnotatedFor; import java.io.File; import java.io.IOException; @@ -502,6 +503,7 @@ * @see URISyntaxException */ +@AnnotatedFor("nullness") public final class URI implements Comparable, Serializable { @@ -702,9 +704,9 @@ public URI(String str) throws URISyntaxException { * RFC 2396, or if the authority component of the string is * present but cannot be parsed as a server-based authority */ - public URI(String scheme, - String userInfo, String host, int port, - String path, String query, String fragment) + public URI(@Nullable String scheme, + @Nullable String userInfo, @Nullable String host, int port, + @Nullable String path, @Nullable String query, @Nullable String fragment) throws URISyntaxException { String s = toString(scheme, null, @@ -775,9 +777,9 @@ public URI(String scheme, * RFC 2396, or if the authority component of the string is * present but cannot be parsed as a server-based authority */ - public URI(String scheme, - String authority, - String path, String query, String fragment) + public URI(@Nullable String scheme, + @Nullable String authority, + @Nullable String path, @Nullable String query, @Nullable String fragment) throws URISyntaxException { String s = toString(scheme, null, @@ -809,7 +811,7 @@ public URI(String scheme, * If the URI string constructed from the given components * violates RFC 2396 */ - public URI(String scheme, String host, String path, String fragment) + public URI(@Nullable String scheme, @Nullable String host, @Nullable String path, @Nullable String fragment) throws URISyntaxException { this(scheme, null, host, -1, path, null, fragment); @@ -852,7 +854,7 @@ public URI(String scheme, String host, String path, String fragment) * If the URI string constructed from the given components * violates RFC 2396 */ - public URI(String scheme, String ssp, String fragment) + public URI(@Nullable String scheme, @Nullable String ssp, @Nullable String fragment) throws URISyntaxException { new Parser(toString(scheme, ssp, @@ -865,7 +867,7 @@ public URI(String scheme, String ssp, String fragment) * Constructs a simple URI consisting of only a scheme and a pre-validated * path. Provides a fast-path for some internal cases. */ - URI(String scheme, String path) { + URI(@Nullable String scheme, @Nullable String path) { assert validSchemeAndPath(scheme, path); this.scheme = scheme; this.path = path; @@ -1160,7 +1162,7 @@ public URL toURL() throws MalformedURLException { * @return The scheme component of this URI, * or {@code null} if the scheme is undefined */ - public String getScheme() { + public @Nullable String getScheme() { return scheme; } @@ -1262,7 +1264,7 @@ public String getSchemeSpecificPart() { * @return The raw authority component of this URI, * or {@code null} if the authority is undefined */ - public String getRawAuthority() { + public @Nullable String getRawAuthority() { return authority; } @@ -1276,7 +1278,7 @@ public String getRawAuthority() { * @return The decoded authority component of this URI, * or {@code null} if the authority is undefined */ - public String getAuthority() { + public @Nullable String getAuthority() { String auth = decodedAuthority; if ((auth == null) && (authority != null)) { decodedAuthority = auth = decode(authority); @@ -1294,7 +1296,7 @@ public String getAuthority() { * @return The raw user-information component of this URI, * or {@code null} if the user information is undefined */ - public String getRawUserInfo() { + public @Nullable String getRawUserInfo() { return userInfo; } @@ -1308,7 +1310,7 @@ public String getRawUserInfo() { * @return The decoded user-information component of this URI, * or {@code null} if the user information is undefined */ - public String getUserInfo() { + public @Nullable String getUserInfo() { String user = decodedUserInfo; if ((user == null) && (userInfo != null)) { decodedUserInfo = user = decode(userInfo); @@ -1352,7 +1354,7 @@ public String getUserInfo() { * @return The host component of this URI, * or {@code null} if the host is undefined */ - public String getHost() { + public @Nullable String getHost() { return host; } @@ -1380,7 +1382,7 @@ public int getPort() { * @return The path component of this URI, * or {@code null} if the path is undefined */ - public String getRawPath() { + public @Nullable String getRawPath() { return path; } @@ -1394,7 +1396,7 @@ public String getRawPath() { * @return The decoded path component of this URI, * or {@code null} if the path is undefined */ - public String getPath() { + public @Nullable String getPath() { String decoded = decodedPath; if ((decoded == null) && (path != null)) { decodedPath = decoded = decode(path); @@ -1411,7 +1413,7 @@ public String getPath() { * @return The raw query component of this URI, * or {@code null} if the query is undefined */ - public String getRawQuery() { + public @Nullable String getRawQuery() { return query; } @@ -1425,7 +1427,7 @@ public String getRawQuery() { * @return The decoded query component of this URI, * or {@code null} if the query is undefined */ - public String getQuery() { + public @Nullable String getQuery() { String decoded = decodedQuery; if ((decoded == null) && (query != null)) { decodedQuery = decoded = decode(query, false); @@ -1442,7 +1444,7 @@ public String getQuery() { * @return The raw fragment component of this URI, * or {@code null} if the fragment is undefined */ - public String getRawFragment() { + public @Nullable String getRawFragment() { return fragment; } @@ -1456,7 +1458,7 @@ public String getRawFragment() { * @return The decoded fragment component of this URI, * or {@code null} if the fragment is undefined */ - public String getFragment() { + public @Nullable String getFragment() { String decoded = decodedFragment; if ((decoded == null) && (fragment != null)) { decodedFragment = decoded = decode(fragment, false); From 0bb685c513c959ffe5384b412cda7abfa155b79f Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Fri, 8 Sep 2023 03:50:09 -0400 Subject: [PATCH 30/50] Fix annotations of `Attributes`. (#62) --- .../share/classes/java/util/jar/Attributes.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/java.base/share/classes/java/util/jar/Attributes.java b/src/java.base/share/classes/java/util/jar/Attributes.java index 0f3aca870e87c..6edba9e37828f 100644 --- a/src/java.base/share/classes/java/util/jar/Attributes.java +++ b/src/java.base/share/classes/java/util/jar/Attributes.java @@ -120,7 +120,7 @@ public Attributes(Attributes attr) { * @return the value of the specified attribute name, or null if * not found. */ - public Object get(Object name) { + public @Nullable Object get(@Nullable Object name) { return map.get(name); } @@ -139,7 +139,7 @@ public Object get(Object name) { * not found. * @throws IllegalArgumentException if the attribute name is invalid */ - public String getValue(String name) { + public @Nullable String getValue(String name) { return (String)get(Name.of(name)); } @@ -156,7 +156,7 @@ public String getValue(String name) { * @return the String value of the specified Attribute.Name, or null if * not found. */ - public String getValue(Name name) { + public @Nullable String getValue(@Nullable Name name) { return (String)get(name); } @@ -171,7 +171,7 @@ public String getValue(Name name) { * @throws ClassCastException if the name is not a Attributes.Name * or the value is not a String */ - public Object put(Object name, Object value) { + public @Nullable Object put(Object name, Object value) { return map.put((Attributes.Name)name, (String)value); } @@ -191,7 +191,7 @@ public Object put(Object name, Object value) { * @return the previous value of the attribute, or null if none * @throws IllegalArgumentException if the attribute name is invalid */ - public String putValue(String name, String value) { + public @Nullable String putValue(String name, String value) { return (String)put(Name.of(name), value); } @@ -202,7 +202,7 @@ public String putValue(String name, String value) { * @param name attribute name * @return the previous value of the attribute, or null if none */ - public Object remove(@GuardSatisfied @Nullable @UnknownSignedness Object name) { + public @Nullable Object remove(@GuardSatisfied @Nullable @UnknownSignedness Object name) { return map.remove(name); } @@ -237,7 +237,7 @@ public boolean containsKey(@GuardSatisfied @Nullable @UnknownSignedness Object n * @param attr the Attributes to be stored in this map * @throws ClassCastException if attr is not an Attributes */ - public void putAll(Map attr) { + public void putAll(Map attr) { // ## javac bug? if (!Attributes.class.isInstance(attr)) throw new ClassCastException(); From b1d56d026a10529674082a8c73c8a65b1e0cab37 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Fri, 8 Sep 2023 12:05:43 -0400 Subject: [PATCH 31/50] Add+fix annotations in zip+jar streams. (#61) --- .../share/classes/java/util/jar/JarInputStream.java | 2 +- .../share/classes/java/util/zip/ZipInputStream.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/java/util/jar/JarInputStream.java b/src/java.base/share/classes/java/util/jar/JarInputStream.java index 3dd761d6bdbd8..7c04a20ade8e1 100644 --- a/src/java.base/share/classes/java/util/jar/JarInputStream.java +++ b/src/java.base/share/classes/java/util/jar/JarInputStream.java @@ -128,7 +128,7 @@ private JarEntry checkManifest(JarEntry e) * @throws SecurityException if any of the jar file entries * are incorrectly signed. */ - public ZipEntry getNextEntry() throws IOException { + public @Nullable ZipEntry getNextEntry() throws IOException { JarEntry e; if (first == null) { e = (JarEntry)super.getNextEntry(); diff --git a/src/java.base/share/classes/java/util/zip/ZipInputStream.java b/src/java.base/share/classes/java/util/zip/ZipInputStream.java index 633bc25b539c4..a6466b5412328 100644 --- a/src/java.base/share/classes/java/util/zip/ZipInputStream.java +++ b/src/java.base/share/classes/java/util/zip/ZipInputStream.java @@ -30,6 +30,7 @@ import org.checkerframework.checker.index.qual.LTEqLengthOf; import org.checkerframework.checker.mustcall.qual.MustCallAlias; import org.checkerframework.framework.qual.AnnotatedFor; +import org.checkerframework.checker.nullness.qual.Nullable; import java.io.InputStream; import java.io.IOException; @@ -50,7 +51,7 @@ * @author David Connelly * @since 1.1 */ -@AnnotatedFor({"index"}) +@AnnotatedFor({"index", "nullness"}) public class ZipInputStream extends InflaterInputStream implements ZipConstants { private ZipEntry entry; private int flag; @@ -121,7 +122,7 @@ private void ensureOpen() throws IOException { * @throws ZipException if a ZIP file error has occurred * @throws IOException if an I/O error has occurred */ - public ZipEntry getNextEntry() throws IOException { + public @Nullable ZipEntry getNextEntry() throws IOException { ensureOpen(); if (entry != null) { closeEntry(); From fddbd35ef2a2f557fd8ebb5cc9e394bd9dfd6d1b Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Fri, 8 Sep 2023 14:56:57 -0400 Subject: [PATCH 32/50] Annotate `AtomicReference` for nullness. (#52) --- .../java/util/concurrent/atomic/AtomicReference.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/java/util/concurrent/atomic/AtomicReference.java b/src/java.base/share/classes/java/util/concurrent/atomic/AtomicReference.java index 73e2b60cf30a3..6d7efffd373f7 100644 --- a/src/java.base/share/classes/java/util/concurrent/atomic/AtomicReference.java +++ b/src/java.base/share/classes/java/util/concurrent/atomic/AtomicReference.java @@ -36,7 +36,9 @@ package java.util.concurrent.atomic; import org.checkerframework.checker.interning.qual.UsesObjectEquals; +import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.framework.qual.AnnotatedFor; +import org.checkerframework.framework.qual.CFComment; import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; @@ -51,8 +53,14 @@ * @author Doug Lea * @param The type of object referred to by this reference */ -@AnnotatedFor({"interning"}) -public @UsesObjectEquals class AtomicReference implements java.io.Serializable { +@AnnotatedFor({"interning", "nullness"}) +@CFComment({"nullness: It is permitted to use AtomicReference<@NonNull MyType>", + "but in such a case:", + "* the user must use the one-arg constructor to provide an initialValue", + "* the user needs to suppress a warning:", + "@SuppressWarnings(\"nullness:type.argument\") // initialValue is provided" + }) +public @UsesObjectEquals class AtomicReference<@Nullable V> implements java.io.Serializable { private static final long serialVersionUID = -1848883965231344442L; private static final VarHandle VALUE; static { From 8d59f980a1c84e52baf6fea4aed444565c37c9af Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Sat, 9 Sep 2023 03:46:12 -0400 Subject: [PATCH 33/50] Add missing `@Nullable` annotations in serialization streams. (#60) --- src/java.base/share/classes/java/io/ObjectInput.java | 3 ++- .../share/classes/java/io/ObjectInputStream.java | 10 +++++----- .../share/classes/java/io/ObjectOutputStream.java | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/java.base/share/classes/java/io/ObjectInput.java b/src/java.base/share/classes/java/io/ObjectInput.java index e214ce12b1bcd..2a408f69d5cf1 100644 --- a/src/java.base/share/classes/java/io/ObjectInput.java +++ b/src/java.base/share/classes/java/io/ObjectInput.java @@ -30,6 +30,7 @@ import org.checkerframework.checker.index.qual.LTEqLengthOf; import org.checkerframework.checker.index.qual.LTLengthOf; import org.checkerframework.checker.index.qual.NonNegative; +import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.framework.qual.AnnotatedFor; /** @@ -54,7 +55,7 @@ public interface ObjectInput extends DataInput, AutoCloseable { * @throws IOException If any of the usual Input/Output * related exceptions occur. */ - public Object readObject() + public @Nullable Object readObject() throws ClassNotFoundException, IOException; /** diff --git a/src/java.base/share/classes/java/io/ObjectInputStream.java b/src/java.base/share/classes/java/io/ObjectInputStream.java index 36424ea2533ba..bc4a7ae3daf9a 100644 --- a/src/java.base/share/classes/java/io/ObjectInputStream.java +++ b/src/java.base/share/classes/java/io/ObjectInputStream.java @@ -478,7 +478,7 @@ protected ObjectInputStream() throws IOException, SecurityException { * stream instead of objects. * @throws IOException Any of the usual Input/Output related exceptions. */ - public final Object readObject() + public final @Nullable Object readObject() throws IOException, ClassNotFoundException { return readObject(Object.class); } @@ -558,7 +558,7 @@ private final Object readObject(Class type) * @see #readObject() * @since 1.2 */ - protected Object readObjectOverride() + protected @Nullable Object readObjectOverride() throws IOException, ClassNotFoundException { return null; @@ -613,7 +613,7 @@ protected Object readObjectOverride() * @throws IOException if an I/O error occurs during deserialization * @since 1.4 */ - public Object readUnshared() throws IOException, ClassNotFoundException { + public @Nullable Object readUnshared() throws IOException, ClassNotFoundException { // if nested read, passHandle contains handle of enclosing object int outerHandle = passHandle; try { @@ -1260,7 +1260,7 @@ public String readUTF() throws IOException { * @return the deserialization filter for the stream; may be null * @since 9 */ - public final ObjectInputFilter getObjectInputFilter() { + public final @Nullable ObjectInputFilter getObjectInputFilter() { return serialFilter; } @@ -1345,7 +1345,7 @@ public final ObjectInputFilter getObjectInputFilter() { * if the filter has already been set. * @since 9 */ - public final void setObjectInputFilter(ObjectInputFilter filter) { + public final void setObjectInputFilter(@Nullable ObjectInputFilter filter) { @SuppressWarnings("removal") SecurityManager sm = System.getSecurityManager(); if (sm != null) { diff --git a/src/java.base/share/classes/java/io/ObjectOutputStream.java b/src/java.base/share/classes/java/io/ObjectOutputStream.java index 4bad640bb5661..d0ceff040b5ff 100644 --- a/src/java.base/share/classes/java/io/ObjectOutputStream.java +++ b/src/java.base/share/classes/java/io/ObjectOutputStream.java @@ -383,7 +383,7 @@ public final void writeObject(@Nullable Object obj) throws IOException { * @see #writeObject(Object) * @since 1.2 */ - protected void writeObjectOverride(Object obj) throws IOException { + protected void writeObjectOverride(@Nullable Object obj) throws IOException { } /** From 27bb756ad8f0b6da885126dd41135c934bab67bd Mon Sep 17 00:00:00 2001 From: Adam Gent Date: Thu, 14 Sep 2023 00:41:04 -0400 Subject: [PATCH 34/50] Make Map.entry require non-null parameters (#178) Co-authored-by: Michael Ernst Co-authored-by: Suzanne Millstein --- .../share/classes/java/util/Map.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/java.base/share/classes/java/util/Map.java b/src/java.base/share/classes/java/util/Map.java index fe15bdc651224..17374ac5e7026 100644 --- a/src/java.base/share/classes/java/util/Map.java +++ b/src/java.base/share/classes/java/util/Map.java @@ -641,7 +641,7 @@ public static Comparator> comparingByValue(Comparator Map.Entry copyOf(Map.Entry e) { + public static Map.Entry copyOf(Map.Entry e) { Objects.requireNonNull(e); if (e instanceof KeyValueHolder) { return (Map.Entry) e; @@ -1396,7 +1396,7 @@ static Map of() { * * @since 9 */ - static Map of(K k1, V v1) { + static Map of(K k1, V v1) { return new ImmutableCollections.Map1<>(k1, v1); } @@ -1416,7 +1416,7 @@ static Map of(K k1, V v1) { * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2) { + static Map of(K k1, V v1, K k2, V v2) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2); } @@ -1438,7 +1438,7 @@ static Map of(K k1, V v1, K k2, V v2) * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3) { + static Map of(K k1, V v1, K k2, V v2, K k3, V v3) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3); } @@ -1462,7 +1462,7 @@ static Map of(K k1, V v1, K k2, V v2, * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) { + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4); } @@ -1488,7 +1488,7 @@ static Map of(K k1, V v1, K k2, V v2, * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) { + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5); } @@ -1516,7 +1516,7 @@ static Map of(K k1, V v1, K k2, V v2, * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6); @@ -1548,7 +1548,7 @@ static Map of(K k1, V v1, K k2, V v2, * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7); @@ -1582,7 +1582,7 @@ static Map of(K k1, V v1, K k2, V v2, * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8); @@ -1618,7 +1618,7 @@ static Map of(K k1, V v1, K k2, V v2, * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9); @@ -1656,7 +1656,7 @@ static Map of(K k1, V v1, K k2, V v2, * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10); @@ -1695,7 +1695,7 @@ static Map of(K k1, V v1, K k2, V v2, */ @SafeVarargs @SuppressWarnings("varargs") - static Map ofEntries(Entry... entries) { + static Map ofEntries(Entry... entries) { if (entries.length == 0) { // implicit null check of entries array @SuppressWarnings("unchecked") var map = (Map) ImmutableCollections.EMPTY_MAP; @@ -1751,7 +1751,7 @@ static Map ofEntries(Entry Entry entry(K k, V v) { + static Entry entry(@NonNull K k, @NonNull V v) { // KeyValueHolder checks for nulls return new KeyValueHolder<>(k, v); } @@ -1774,7 +1774,7 @@ static Entry entry(K k, V v) { * @since 10 */ @SuppressWarnings({"rawtypes","unchecked"}) - static Map copyOf(Map map) { + static Map copyOf(Map map) { if (map instanceof ImmutableCollections.AbstractImmutableMap) { return (Map)map; } else { From 767a7ba9926419eb338d7a4e13a808f80fb83b56 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Mon, 25 Sep 2023 10:14:30 -0400 Subject: [PATCH 35/50] Add missing `@Nullable` annotations on `Comparator.nullsFirst` and `nullsLast`. (#64) --- src/java.base/share/classes/java/util/Comparator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/java/util/Comparator.java b/src/java.base/share/classes/java/util/Comparator.java index 526d6b17dcef1..ee7b940507590 100644 --- a/src/java.base/share/classes/java/util/Comparator.java +++ b/src/java.base/share/classes/java/util/Comparator.java @@ -389,7 +389,7 @@ public static > Comparator reverseOrder() { * {@code Comparator}. * @since 1.8 */ - public static Comparator<@Nullable T> nullsFirst(Comparator<@Nullable ? super T> comparator) { + public static Comparator<@Nullable T> nullsFirst(@Nullable Comparator<@Nullable ? super T> comparator) { return new Comparators.NullComparator<>(true, comparator); } @@ -410,7 +410,7 @@ public static > Comparator reverseOrder() { * {@code Comparator}. * @since 1.8 */ - public static Comparator<@Nullable T> nullsLast(Comparator<@Nullable ? super T> comparator) { + public static Comparator<@Nullable T> nullsLast(@Nullable Comparator<@Nullable ? super T> comparator) { return new Comparators.NullComparator<>(false, comparator); } From 75c7ea61dbb58b6fae15dc3b22747bc62aebe554 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Mon, 25 Sep 2023 10:15:15 -0400 Subject: [PATCH 36/50] Add missing `@Nullable` annotations in `ZipEntry`. (#65) --- .../share/classes/java/util/zip/ZipEntry.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/java.base/share/classes/java/util/zip/ZipEntry.java b/src/java.base/share/classes/java/util/zip/ZipEntry.java index de8799185f5d0..85a6b46ca0838 100644 --- a/src/java.base/share/classes/java/util/zip/ZipEntry.java +++ b/src/java.base/share/classes/java/util/zip/ZipEntry.java @@ -326,7 +326,7 @@ public ZipEntry setLastModifiedTime(FileTime time) { * @see #setLastModifiedTime(FileTime) * @since 1.8 */ - public FileTime getLastModifiedTime() { + public @Nullable FileTime getLastModifiedTime() { if (mtime != null) return mtime; if (xdostime == -1) @@ -366,7 +366,7 @@ public ZipEntry setLastAccessTime(FileTime time) { * @see #setLastAccessTime(FileTime) * @since 1.8 */ - public FileTime getLastAccessTime() { + public @Nullable FileTime getLastAccessTime() { return atime; } @@ -402,7 +402,7 @@ public ZipEntry setCreationTime(FileTime time) { * @see #setCreationTime(FileTime) * @since 1.8 */ - public FileTime getCreationTime() { + public @Nullable FileTime getCreationTime() { return ctime; } @@ -531,7 +531,7 @@ public int getMethod() { * * @see #getExtra() */ - public void setExtra(byte[] extra) { + public void setExtra(byte @Nullable [] extra) { setExtra0(extra, false, true); } @@ -659,7 +659,7 @@ void setExtra0(byte[] extra, boolean doZIP64, boolean isLOC) { * * @see #getComment() */ - public void setComment(String comment) { + public void setComment(@Nullable String comment) { this.comment = comment; } From 75b4b69cff61204ddc1806f0c8fede372fd5fc08 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Mon, 25 Sep 2023 10:17:01 -0400 Subject: [PATCH 37/50] Add missing `@Nullable` annotations in `ClassLoader` and `URLClassLoader`, and annotate `SecureClassLoader`. (#66) --- .../share/classes/java/lang/ClassLoader.java | 4 ++-- .../share/classes/java/net/URLClassLoader.java | 16 ++++++++-------- .../classes/java/security/SecureClassLoader.java | 12 ++++++++---- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/java.base/share/classes/java/lang/ClassLoader.java b/src/java.base/share/classes/java/lang/ClassLoader.java index 4016c12b82dec..044271b4a9016 100644 --- a/src/java.base/share/classes/java/lang/ClassLoader.java +++ b/src/java.base/share/classes/java/lang/ClassLoader.java @@ -437,7 +437,7 @@ private static String nameAndId(ClassLoader ld) { * * @since 9 */ - protected ClassLoader(String name, ClassLoader parent) { + protected ClassLoader(@Nullable String name, @Nullable ClassLoader parent) { this(checkCreateClassLoader(name), name, parent); } @@ -499,7 +499,7 @@ protected ClassLoader() { * * @since 9 */ - public String getName() { + public @Nullable String getName() { return name; } diff --git a/src/java.base/share/classes/java/net/URLClassLoader.java b/src/java.base/share/classes/java/net/URLClassLoader.java index a083d8966e995..3980c148febd9 100644 --- a/src/java.base/share/classes/java/net/URLClassLoader.java +++ b/src/java.base/share/classes/java/net/URLClassLoader.java @@ -120,7 +120,7 @@ public URLClassLoader(URL[] urls, @Nullable ClassLoader parent) { this.ucp = new URLClassPath(urls, acc); } - URLClassLoader(String name, URL[] urls, ClassLoader parent, + URLClassLoader(@Nullable String name, URL[] urls, @Nullable ClassLoader parent, @SuppressWarnings("removal") AccessControlContext acc) { super(name, parent); this.acc = acc; @@ -185,8 +185,8 @@ public URLClassLoader(URL[] urls) { * @see SecurityManager#checkCreateClassLoader */ @SuppressWarnings("removal") - public URLClassLoader(URL[] urls, ClassLoader parent, - URLStreamHandlerFactory factory) { + public URLClassLoader(URL[] urls, @Nullable ClassLoader parent, + @Nullable URLStreamHandlerFactory factory) { super(parent); this.acc = AccessController.getContext(); this.ucp = new URLClassPath(urls, factory, acc); @@ -216,9 +216,9 @@ public URLClassLoader(URL[] urls, ClassLoader parent, * @since 9 */ @SuppressWarnings("removal") - public URLClassLoader(String name, + public URLClassLoader(@Nullable String name, URL[] urls, - ClassLoader parent) { + @Nullable ClassLoader parent) { super(name, parent); this.acc = AccessController.getContext(); this.ucp = new URLClassPath(urls, acc); @@ -247,8 +247,8 @@ public URLClassLoader(String name, * @since 9 */ @SuppressWarnings("removal") - public URLClassLoader(String name, URL[] urls, ClassLoader parent, - URLStreamHandlerFactory factory) { + public URLClassLoader(@Nullable String name, URL[] urls, @Nullable ClassLoader parent, + @Nullable URLStreamHandlerFactory factory) { super(name, parent); this.acc = AccessController.getContext(); this.ucp = new URLClassPath(urls, factory, acc); @@ -792,7 +792,7 @@ public Void run() throws SecurityException { * @return the resulting class loader */ public static URLClassLoader newInstance(final URL[] urls, - final ClassLoader parent) { + final @Nullable ClassLoader parent) { // Save the caller's context @SuppressWarnings("removal") final AccessControlContext acc = AccessController.getContext(); diff --git a/src/java.base/share/classes/java/security/SecureClassLoader.java b/src/java.base/share/classes/java/security/SecureClassLoader.java index 9ea5e3e503bc7..9b890ef3148c7 100644 --- a/src/java.base/share/classes/java/security/SecureClassLoader.java +++ b/src/java.base/share/classes/java/security/SecureClassLoader.java @@ -25,6 +25,9 @@ package java.security; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.framework.qual.AnnotatedFor; + import java.util.Map; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; @@ -41,6 +44,7 @@ * @author Roland Schemers * @since 1.2 */ +@AnnotatedFor("nullness") public class SecureClassLoader extends ClassLoader { /* @@ -73,7 +77,7 @@ public class SecureClassLoader extends ClassLoader { * creation of a class loader. * @see SecurityManager#checkCreateClassLoader */ - protected SecureClassLoader(ClassLoader parent) { + protected SecureClassLoader(@Nullable ClassLoader parent) { super(parent); } @@ -109,7 +113,7 @@ protected SecureClassLoader() { * * @since 9 */ - protected SecureClassLoader(String name, ClassLoader parent) { + protected SecureClassLoader(@Nullable String name, @Nullable ClassLoader parent) { super(name, parent); } @@ -145,7 +149,7 @@ protected SecureClassLoader(String name, ClassLoader parent) { */ protected final Class defineClass(String name, byte[] b, int off, int len, - CodeSource cs) + @Nullable CodeSource cs) { return defineClass(name, b, off, len, getProtectionDomain(cs)); } @@ -177,7 +181,7 @@ protected final Class defineClass(String name, * @since 1.5 */ protected final Class defineClass(String name, java.nio.ByteBuffer b, - CodeSource cs) + @Nullable CodeSource cs) { return defineClass(name, b, getProtectionDomain(cs)); } From 24c35dd6546487b3ecd25049d02b20a661314b55 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Mon, 25 Sep 2023 10:20:37 -0400 Subject: [PATCH 38/50] Annotate `java.lang.reflect.Array` for nullness. (#67) --- src/java.base/share/classes/java/lang/reflect/Array.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/java/lang/reflect/Array.java b/src/java.base/share/classes/java/lang/reflect/Array.java index b8ff2bd08bace..7b833789af5cb 100644 --- a/src/java.base/share/classes/java/lang/reflect/Array.java +++ b/src/java.base/share/classes/java/lang/reflect/Array.java @@ -29,7 +29,9 @@ import org.checkerframework.checker.index.qual.LengthOf; import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.interning.qual.UsesObjectEquals; +import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.common.value.qual.StaticallyExecutable; +import org.checkerframework.framework.qual.CFComment; import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.dataflow.qual.SideEffectFree; import org.checkerframework.framework.qual.AnnotatedFor; @@ -47,7 +49,7 @@ * @author Nakul Saraiya * @since 1.1 */ -@AnnotatedFor({"index", "interning"}) +@AnnotatedFor({"index", "interning", "nullness"}) public final @UsesObjectEquals class Array { @@ -157,7 +159,7 @@ public static Object newInstance(Class componentType, @NonNegative int... dim * length of the specified array */ @Pure - public static native Object get(Object array, @IndexFor({"#1"}) int index) + public static native @Nullable Object get(Object array, @IndexFor({"#1"}) int index) throws IllegalArgumentException, ArrayIndexOutOfBoundsException; /** @@ -345,6 +347,9 @@ public static native double getDouble(Object array, @IndexFor({"#1"}) int index) * argument is negative, or if it is greater than or equal to * the length of the specified array */ + @CFComment({"nullness: The passed array might or might not be annotated to allow nullable", + "values. We don't know which, so we conservatively issue a warning when someone passes null.", + "Compare Method.invoke."}) public static native void set(Object array, @IndexFor({"#1"}) int index, Object value) throws IllegalArgumentException, ArrayIndexOutOfBoundsException; From 70f1c79e5ba9909d0524e9ef00f0c6bfa196708b Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Mon, 25 Sep 2023 10:36:19 -0400 Subject: [PATCH 39/50] Annotate `AttributedString` and `AbstractOwnableSynchronizer` for nullness. (#68) --- .../share/classes/java/text/AttributedString.java | 15 +++++++-------- .../locks/AbstractOwnableSynchronizer.java | 7 ++++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/java.base/share/classes/java/text/AttributedString.java b/src/java.base/share/classes/java/text/AttributedString.java index e5276038ac645..3ef96adb068c0 100644 --- a/src/java.base/share/classes/java/text/AttributedString.java +++ b/src/java.base/share/classes/java/text/AttributedString.java @@ -25,11 +25,10 @@ package java.text; +import org.checkerframework.framework.qual.AnnotatedFor; import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; -import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.dataflow.qual.Pure; -import org.checkerframework.dataflow.qual.SideEffectFree; import java.util.*; import java.text.AttributedCharacterIterator.Attribute; @@ -52,7 +51,7 @@ * @see Annotation * @since 1.2 */ - +@AnnotatedFor("nullness") public class AttributedString { // field holding the text String text; @@ -234,7 +233,7 @@ public AttributedString(AttributedCharacterIterator text, public AttributedString(AttributedCharacterIterator text, int beginIndex, int endIndex, - Attribute[] attributes) { + Attribute @Nullable [] attributes) { if (text == null) { throw new NullPointerException(); } @@ -317,7 +316,7 @@ public AttributedString(AttributedCharacterIterator text, * @throws IllegalArgumentException if the AttributedString has length 0 * (attributes cannot be applied to a 0-length range). */ - public void addAttribute(Attribute attribute, Object value) { + public void addAttribute(Attribute attribute, @Nullable Object value) { if (attribute == null) { throw new NullPointerException(); @@ -342,7 +341,7 @@ public void addAttribute(Attribute attribute, Object value) { * greater than the length of the string, or beginIndex and endIndex together don't * define a non-empty subrange of the string. */ - public void addAttribute(Attribute attribute, Object value, + public void addAttribute(Attribute attribute, @Nullable Object value, int beginIndex, int endIndex) { if (attribute == null) { @@ -570,7 +569,7 @@ public AttributedCharacterIterator getIterator() { * @param attributes a list of attributes that the client is interested in * @return an iterator providing access to the entire text and its selected attributes */ - public AttributedCharacterIterator getIterator(Attribute[] attributes) { + public AttributedCharacterIterator getIterator(Attribute @Nullable [] attributes) { return getIterator(attributes, 0, length()); } @@ -590,7 +589,7 @@ public AttributedCharacterIterator getIterator(Attribute[] attributes) { * endIndex is greater than the length of the string, or beginIndex is * greater than endIndex. */ - public AttributedCharacterIterator getIterator(Attribute[] attributes, int beginIndex, int endIndex) { + public AttributedCharacterIterator getIterator(Attribute @Nullable [] attributes, int beginIndex, int endIndex) { return new AttributedStringIterator(attributes, beginIndex, endIndex); } diff --git a/src/java.base/share/classes/java/util/concurrent/locks/AbstractOwnableSynchronizer.java b/src/java.base/share/classes/java/util/concurrent/locks/AbstractOwnableSynchronizer.java index 2b43c85da2f16..82109acbc8060 100644 --- a/src/java.base/share/classes/java/util/concurrent/locks/AbstractOwnableSynchronizer.java +++ b/src/java.base/share/classes/java/util/concurrent/locks/AbstractOwnableSynchronizer.java @@ -36,6 +36,7 @@ package java.util.concurrent.locks; import org.checkerframework.checker.interning.qual.UsesObjectEquals; +import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.framework.qual.AnnotatedFor; /** @@ -50,7 +51,7 @@ * @since 1.6 * @author Doug Lea */ -@AnnotatedFor({"interning"}) +@AnnotatedFor({"interning", "nullness"}) public abstract @UsesObjectEquals class AbstractOwnableSynchronizer implements java.io.Serializable { @@ -74,7 +75,7 @@ protected AbstractOwnableSynchronizer() { } * {@code volatile} field accesses. * @param thread the owner thread */ - protected final void setExclusiveOwnerThread(Thread thread) { + protected final void setExclusiveOwnerThread(@Nullable Thread thread) { exclusiveOwnerThread = thread; } @@ -84,7 +85,7 @@ protected final void setExclusiveOwnerThread(Thread thread) { * impose any synchronization or {@code volatile} field accesses. * @return the owner thread */ - protected final Thread getExclusiveOwnerThread() { + protected final @Nullable Thread getExclusiveOwnerThread() { return exclusiveOwnerThread; } } From 91ecb6ed79995cd6f13abce6087a501cac05c825 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Mon, 25 Sep 2023 10:39:48 -0400 Subject: [PATCH 40/50] Annotate a few `nio` classes for nullness. (#69) --- .../share/classes/java/nio/channels/SelectionKey.java | 7 ++++--- .../share/classes/java/nio/file/FileSystems.java | 9 +++++---- .../nio/file/attribute/BasicFileAttributeView.java | 11 +++++++---- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/java.base/share/classes/java/nio/channels/SelectionKey.java b/src/java.base/share/classes/java/nio/channels/SelectionKey.java index 7074ddcfa31c0..986fe56808213 100644 --- a/src/java.base/share/classes/java/nio/channels/SelectionKey.java +++ b/src/java.base/share/classes/java/nio/channels/SelectionKey.java @@ -27,6 +27,7 @@ import org.checkerframework.checker.interning.qual.UsesObjectEquals; import org.checkerframework.checker.mustcall.qual.NotOwning; +import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.framework.qual.AnnotatedFor; import java.lang.invoke.MethodHandles; @@ -104,7 +105,7 @@ * @see Selector */ -@AnnotatedFor({"interning", "mustcall"}) +@AnnotatedFor({"interning", "mustcall", "nullness"}) public abstract @UsesObjectEquals class SelectionKey { /** @@ -459,7 +460,7 @@ public final boolean isAcceptable() { * @return The previously-attached object, if any, * otherwise {@code null} */ - public final Object attach(Object ob) { + public final @Nullable Object attach(@Nullable Object ob) { return ATTACHMENT.getAndSet(this, ob); } @@ -469,7 +470,7 @@ public final Object attach(Object ob) { * @return The object currently attached to this key, * or {@code null} if there is no attachment */ - public final Object attachment() { + public final @Nullable Object attachment() { return attachment; } diff --git a/src/java.base/share/classes/java/nio/file/FileSystems.java b/src/java.base/share/classes/java/nio/file/FileSystems.java index 49c3710cc028d..795153146606d 100644 --- a/src/java.base/share/classes/java/nio/file/FileSystems.java +++ b/src/java.base/share/classes/java/nio/file/FileSystems.java @@ -26,6 +26,7 @@ package java.nio.file; import org.checkerframework.checker.interning.qual.UsesObjectEquals; +import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.framework.qual.AnnotatedFor; import java.nio.file.spi.FileSystemProvider; @@ -89,7 +90,7 @@ * @since 1.7 */ -@AnnotatedFor({"interning"}) +@AnnotatedFor({"interning", "nullness"}) public final @UsesObjectEquals class FileSystems { private FileSystems() { } @@ -331,7 +332,7 @@ public static FileSystem newFileSystem(URI uri, Map env) * if a security manager is installed and it denies an unspecified * permission required by the file system provider implementation */ - public static FileSystem newFileSystem(URI uri, Map env, ClassLoader loader) + public static FileSystem newFileSystem(URI uri, Map env, @Nullable ClassLoader loader) throws IOException { String scheme = uri.getScheme(); @@ -398,7 +399,7 @@ public static FileSystem newFileSystem(URI uri, Map env, ClassLoader l * permission */ public static FileSystem newFileSystem(Path path, - ClassLoader loader) + @Nullable ClassLoader loader) throws IOException { return newFileSystem(path, Map.of(), loader); @@ -521,7 +522,7 @@ public static FileSystem newFileSystem(Path path) throws IOException { * @since 13 */ public static FileSystem newFileSystem(Path path, Map env, - ClassLoader loader) + @Nullable ClassLoader loader) throws IOException { if (path == null) diff --git a/src/java.base/share/classes/java/nio/file/attribute/BasicFileAttributeView.java b/src/java.base/share/classes/java/nio/file/attribute/BasicFileAttributeView.java index 37508cfd2009e..57c4aa9539d86 100644 --- a/src/java.base/share/classes/java/nio/file/attribute/BasicFileAttributeView.java +++ b/src/java.base/share/classes/java/nio/file/attribute/BasicFileAttributeView.java @@ -25,6 +25,9 @@ package java.nio.file.attribute; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.framework.qual.AnnotatedFor; + import java.io.IOException; /** @@ -100,7 +103,7 @@ * * @since 1.7 */ - +@AnnotatedFor("nullness") public interface BasicFileAttributeView extends FileAttributeView { @@ -176,7 +179,7 @@ public interface BasicFileAttributeView * * @see java.nio.file.Files#setLastModifiedTime */ - void setTimes(FileTime lastModifiedTime, - FileTime lastAccessTime, - FileTime createTime) throws IOException; + void setTimes(@Nullable FileTime lastModifiedTime, + @Nullable FileTime lastAccessTime, + @Nullable FileTime createTime) throws IOException; } From 52688e1695d664dca6462ef31bcc51225f171dd0 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Tue, 26 Sep 2023 17:13:33 -0400 Subject: [PATCH 41/50] Annotate `InetAddress` and friends. (#70) --- .../share/classes/java/net/Inet4Address.java | 2 +- .../share/classes/java/net/Inet6Address.java | 10 ++++---- .../share/classes/java/net/InetAddress.java | 23 +++++++++++++++---- .../classes/java/net/InetSocketAddress.java | 10 +++++--- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/java.base/share/classes/java/net/Inet4Address.java b/src/java.base/share/classes/java/net/Inet4Address.java index 7206606a11b60..87c6735e4232a 100644 --- a/src/java.base/share/classes/java/net/Inet4Address.java +++ b/src/java.base/share/classes/java/net/Inet4Address.java @@ -91,7 +91,7 @@ * @since 1.4 */ -@AnnotatedFor({"interning"}) +@AnnotatedFor({"interning", "nullness"}) public final @UsesObjectEquals class Inet4Address extends InetAddress { static final int INADDRSZ = 4; diff --git a/src/java.base/share/classes/java/net/Inet6Address.java b/src/java.base/share/classes/java/net/Inet6Address.java index 506f95b9bbc92..2ae35b805c31f 100644 --- a/src/java.base/share/classes/java/net/Inet6Address.java +++ b/src/java.base/share/classes/java/net/Inet6Address.java @@ -181,7 +181,7 @@ * @since 1.4 */ -@AnnotatedFor({"interning"}) +@AnnotatedFor({"interning", "nullness"}) public final @UsesObjectEquals class Inet6Address extends InetAddress { static final int INADDRSZ = 16; @@ -434,8 +434,8 @@ boolean isMCOrgLocal() { * * @since 1.5 */ - public static Inet6Address getByAddress(String host, byte[] addr, - NetworkInterface nif) + public static Inet6Address getByAddress(@Nullable String host, byte[] addr, + @Nullable NetworkInterface nif) throws UnknownHostException { if (host != null && !host.isEmpty() && host.charAt(0) == '[') { @@ -467,7 +467,7 @@ public static Inet6Address getByAddress(String host, byte[] addr, * * @since 1.5 */ - public static Inet6Address getByAddress(String host, byte[] addr, + public static Inet6Address getByAddress(@Nullable String host, byte[] addr, int scope_id) throws UnknownHostException { @@ -851,7 +851,7 @@ public int getScopeId() { * @return the scoped interface, or null if not set. * @since 1.5 */ - public NetworkInterface getScopedInterface() { + public @Nullable NetworkInterface getScopedInterface() { return holder6.scope_ifname; } diff --git a/src/java.base/share/classes/java/net/InetAddress.java b/src/java.base/share/classes/java/net/InetAddress.java index 25eb1a44522c6..a204f7ce5b82d 100644 --- a/src/java.base/share/classes/java/net/InetAddress.java +++ b/src/java.base/share/classes/java/net/InetAddress.java @@ -30,6 +30,8 @@ import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.dataflow.qual.SideEffectFree; +import org.checkerframework.framework.qual.AnnotatedFor; +import org.checkerframework.framework.qual.CFComment; import java.util.List; import java.util.NavigableSet; @@ -202,6 +204,7 @@ * @see java.net.InetAddress#getLocalHost() * @since 1.0 */ +@AnnotatedFor({"nullness"}) public class InetAddress implements java.io.Serializable { @Native static final int PREFER_IPV4_VALUE = 0; @@ -544,7 +547,7 @@ public boolean isReachable(int timeout) throws IOException { * @throws IOException if a network error occurs * @since 1.5 */ - public boolean isReachable(NetworkInterface netif, int ttl, + public boolean isReachable(@Nullable NetworkInterface netif, int ttl, int timeout) throws IOException { if (ttl < 0) throw new IllegalArgumentException("ttl can't be negative"); @@ -713,6 +716,12 @@ private static String getHostFromNameService(InetAddress addr, boolean check) { * * @return the raw IP address of this object. */ + @CFComment("nullness: This return type is probably best *not* annotated @Nullable: InetAddress " + + "has a package-private constructor (and is `sealed` in recent releases), so the only " + + "subclasses that exist are the 2 in this package, both of which override the method to " + + "return a non-null value. While there are obscure parts of the JDK that create a plain " + + "InetAddress instance, it is unlikely that any code would choose to call this method on such " + + "an instance.") public byte[] getAddress() { return null; } @@ -723,6 +732,12 @@ public byte[] getAddress() { * @return the raw IP address in a string format. * @since 1.0.2 */ + @CFComment("nullness: This return type is probably best *not* annotated @Nullable: InetAddress " + + "has a package-private constructor (and is `sealed` in recent releases), so the only " + + "subclasses that exist are the 2 in this package, both of which override the method to " + + "return a non-null value. While there are obscure parts of the JDK that create a plain " + + "InetAddress instance, it is unlikely that any code would choose to call this method on such " + + "an instance.") public String getHostAddress() { return null; } @@ -1196,7 +1211,7 @@ private static NameService createNameService() { * @throws UnknownHostException if IP address is of illegal length * @since 1.4 */ - public static InetAddress getByAddress(String host, byte[] addr) + public static InetAddress getByAddress(@Nullable String host, byte[] addr) throws UnknownHostException { if (host != null && !host.isEmpty() && host.charAt(0) == '[') { if (host.charAt(host.length()-1) == ']') { @@ -1254,7 +1269,7 @@ public static InetAddress getByAddress(String host, byte[] addr) * @throws SecurityException if a security manager exists * and its checkConnect method doesn't allow the operation */ - public static InetAddress getByName(String host) + public static InetAddress getByName(@Nullable String host) throws UnknownHostException { return InetAddress.getAllByName(host)[0]; } @@ -1304,7 +1319,7 @@ private static InetAddress getByName(String host, InetAddress reqAddr) * * @see SecurityManager#checkConnect */ - public static InetAddress[] getAllByName(String host) + public static InetAddress[] getAllByName(@Nullable String host) throws UnknownHostException { return getAllByName(host, null); } diff --git a/src/java.base/share/classes/java/net/InetSocketAddress.java b/src/java.base/share/classes/java/net/InetSocketAddress.java index 3191d097b6ab7..71fa48693ed6e 100644 --- a/src/java.base/share/classes/java/net/InetSocketAddress.java +++ b/src/java.base/share/classes/java/net/InetSocketAddress.java @@ -24,6 +24,9 @@ */ package java.net; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.framework.qual.AnnotatedFor; + import java.io.IOException; import java.io.InvalidObjectException; import java.io.ObjectInputStream; @@ -49,6 +52,7 @@ * @see java.net.ServerSocket * @since 1.4 */ +@AnnotatedFor({"nullness"}) public class InetSocketAddress extends SocketAddress { @@ -190,7 +194,7 @@ public InetSocketAddress(int port) { * @throws IllegalArgumentException if the port parameter is outside the specified * range of valid port values. */ - public InetSocketAddress(InetAddress addr, int port) { + public InetSocketAddress(@Nullable InetAddress addr, int port) { holder = new InetSocketAddressHolder( null, addr == null ? InetAddress.anyLocalAddress() : addr, @@ -351,7 +355,7 @@ public final int getPort() { * * @return the InetAddress or {@code null} if it is unresolved. */ - public final InetAddress getAddress() { + public final @Nullable InetAddress getAddress() { return holder.getAddress(); } @@ -431,7 +435,7 @@ public String toString() { * @see java.net.InetAddress#equals(java.lang.Object) */ @Override - public final boolean equals(Object obj) { + public final boolean equals(@Nullable Object obj) { if (obj instanceof InetSocketAddress addr) { return holder.equals(addr.holder); } From b6b6321a54ca3c278f87232e2932a8c303e11e06 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Tue, 26 Sep 2023 17:16:10 -0400 Subject: [PATCH 42/50] Add missing `@Nullable` annotation in `Socket`, and annotate related classes. (#71) --- .../classes/java/net/DatagramSocket.java | 19 ++++++++++--------- .../classes/java/net/MulticastSocket.java | 13 ++++++++++--- .../share/classes/java/net/ServerSocket.java | 15 ++++++++------- .../share/classes/java/net/Socket.java | 2 +- .../share/classes/java/net/SocketOption.java | 4 +++- 5 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/java.base/share/classes/java/net/DatagramSocket.java b/src/java.base/share/classes/java/net/DatagramSocket.java index abe64950f8e68..8e4ced2c37bd5 100644 --- a/src/java.base/share/classes/java/net/DatagramSocket.java +++ b/src/java.base/share/classes/java/net/DatagramSocket.java @@ -26,6 +26,7 @@ package java.net; import org.checkerframework.checker.interning.qual.UsesObjectEquals; +import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.framework.qual.AnnotatedFor; import java.io.IOException; @@ -248,7 +249,7 @@ * @see java.nio.channels.DatagramChannel * @since 1.0 */ -@AnnotatedFor({"interning"}) +@AnnotatedFor({"interning", "nullness"}) public @UsesObjectEquals class DatagramSocket implements java.io.Closeable { // An instance of DatagramSocketAdaptor, NetMulticastSocket, or null @@ -330,7 +331,7 @@ protected DatagramSocket(DatagramSocketImpl impl) { * @see SecurityManager#checkListen * @since 1.4 */ - public DatagramSocket(SocketAddress bindaddr) throws SocketException { + public DatagramSocket(@Nullable SocketAddress bindaddr) throws SocketException { this(createDelegate(bindaddr, DatagramSocket.class)); } @@ -389,7 +390,7 @@ public DatagramSocket(int port) throws SocketException { * @see SecurityManager#checkListen * @since 1.1 */ - public DatagramSocket(int port, InetAddress laddr) throws SocketException { + public DatagramSocket(int port, @Nullable InetAddress laddr) throws SocketException { this(new InetSocketAddress(laddr, port)); } @@ -408,7 +409,7 @@ public DatagramSocket(int port, InetAddress laddr) throws SocketException { * not supported by this socket. * @since 1.4 */ - public void bind(SocketAddress addr) throws SocketException { + public void bind(@Nullable SocketAddress addr) throws SocketException { delegate().bind(addr); } @@ -569,7 +570,7 @@ public boolean isConnected() { * @return the address to which this socket is connected. * @since 1.2 */ - public InetAddress getInetAddress() { + public @Nullable InetAddress getInetAddress() { return delegate().getInetAddress(); } @@ -604,7 +605,7 @@ public int getPort() { * @see #connect(SocketAddress) * @since 1.4 */ - public SocketAddress getRemoteSocketAddress() { + public @Nullable SocketAddress getRemoteSocketAddress() { return delegate().getRemoteSocketAddress(); } @@ -618,7 +619,7 @@ public SocketAddress getRemoteSocketAddress() { * @see #bind(SocketAddress) * @since 1.4 */ - public SocketAddress getLocalSocketAddress() { + public @Nullable SocketAddress getLocalSocketAddress() { return delegate().getLocalSocketAddress(); } @@ -722,7 +723,7 @@ public void receive(DatagramPacket p) throws IOException { * method does not allow the operation * @since 1.1 */ - public InetAddress getLocalAddress() { + public @Nullable InetAddress getLocalAddress() { return delegate().getLocalAddress(); } @@ -1102,7 +1103,7 @@ public boolean isClosed() { * * @since 1.4 */ - public DatagramChannel getChannel() { + public @Nullable DatagramChannel getChannel() { return null; } diff --git a/src/java.base/share/classes/java/net/MulticastSocket.java b/src/java.base/share/classes/java/net/MulticastSocket.java index 6368817a897e2..aed5c64330e2c 100644 --- a/src/java.base/share/classes/java/net/MulticastSocket.java +++ b/src/java.base/share/classes/java/net/MulticastSocket.java @@ -25,6 +25,10 @@ package java.net; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.framework.qual.AnnotatedFor; +import org.checkerframework.framework.qual.CFComment; + import java.io.IOException; import java.nio.channels.DatagramChannel; import java.nio.channels.MulticastChannel; @@ -110,6 +114,7 @@ * @author Pavani Diwanji * @since 1.1 */ +@AnnotatedFor({"nullness"}) public class MulticastSocket extends DatagramSocket { @Override @@ -208,7 +213,7 @@ public MulticastSocket(int port) throws IOException { * * @since 1.4 */ - public MulticastSocket(SocketAddress bindaddr) throws IOException { + public MulticastSocket(@Nullable SocketAddress bindaddr) throws IOException { this(createDelegate(bindaddr, MulticastSocket.class)); } @@ -366,7 +371,7 @@ public void leaveGroup(InetAddress mcastaddr) throws IOException { * @since 1.4 */ @Override - public void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) + public void joinGroup(SocketAddress mcastaddr, @Nullable NetworkInterface netIf) throws IOException { super.joinGroup(mcastaddr, netIf); } @@ -382,7 +387,7 @@ public void joinGroup(SocketAddress mcastaddr, NetworkInterface netIf) * @since 1.4 */ @Override - public void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) + public void leaveGroup(SocketAddress mcastaddr, @Nullable NetworkInterface netIf) throws IOException { super.leaveGroup(mcastaddr, netIf); } @@ -401,6 +406,7 @@ public void leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf) * @see #getInterface() */ @Deprecated(since="14") + @CFComment("nullness: TODO: @Nullable parameter or not?") public void setInterface(InetAddress inf) throws SocketException { delegate().setInterface(inf); } @@ -440,6 +446,7 @@ public InetAddress getInterface() throws SocketException { * @see StandardSocketOptions#IP_MULTICAST_IF * @since 1.4 */ + @CFComment("nullness: TODO: @Nullable parameter or not?") public void setNetworkInterface(NetworkInterface netIf) throws SocketException { delegate().setNetworkInterface(netIf); diff --git a/src/java.base/share/classes/java/net/ServerSocket.java b/src/java.base/share/classes/java/net/ServerSocket.java index c71de8be330da..94cf59e953bd0 100644 --- a/src/java.base/share/classes/java/net/ServerSocket.java +++ b/src/java.base/share/classes/java/net/ServerSocket.java @@ -29,6 +29,7 @@ import org.checkerframework.checker.interning.qual.UsesObjectEquals; import org.checkerframework.checker.mustcall.qual.CreatesMustCallFor; import org.checkerframework.checker.mustcall.qual.MustCallAlias; +import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.framework.qual.AnnotatedFor; import java.io.FileDescriptor; @@ -82,7 +83,7 @@ * @see java.nio.channels.ServerSocketChannel * @since 1.0 */ -@AnnotatedFor({"calledmethods", "interning", "mustcall"}) +@AnnotatedFor({"calledmethods", "interning", "mustcall", "nullness"}) public @UsesObjectEquals class ServerSocket implements java.io.Closeable { /** * Various states of this socket. @@ -270,7 +271,7 @@ public ServerSocket(int port, int backlog) throws IOException { * @see SecurityManager#checkListen * @since 1.1 */ - public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException { + public ServerSocket(int port, int backlog, @Nullable InetAddress bindAddr) throws IOException { setImpl(); if (port < 0 || port > 0xFFFF) throw new IllegalArgumentException( @@ -346,7 +347,7 @@ void createImpl() throws SocketException { * @since 1.4 */ @CreatesMustCallFor - public void bind(SocketAddress endpoint) throws IOException { + public void bind(@Nullable SocketAddress endpoint) throws IOException { bind(endpoint, 50); } @@ -376,7 +377,7 @@ public void bind(SocketAddress endpoint) throws IOException { * @since 1.4 */ @CreatesMustCallFor - public void bind(SocketAddress endpoint, int backlog) throws IOException { + public void bind(@Nullable SocketAddress endpoint, int backlog) throws IOException { if (isClosed()) throw new SocketException("Socket is closed"); if (isBound()) @@ -424,7 +425,7 @@ public void bind(SocketAddress endpoint, int backlog) throws IOException { * * @see SecurityManager#checkConnect */ - public InetAddress getInetAddress() { + public @Nullable InetAddress getInetAddress() { if (!isBound()) return null; try { @@ -493,7 +494,7 @@ public int getLocalPort() { * @since 1.4 */ - public SocketAddress getLocalSocketAddress() { + public @Nullable SocketAddress getLocalSocketAddress() { if (!isBound()) return null; return new InetSocketAddress(getInetAddress(), getLocalPort()); @@ -744,7 +745,7 @@ public void close() throws IOException { * * @since 1.4 */ - public @MustCallAlias ServerSocketChannel getChannel(@MustCallAlias ServerSocket this) { + public @MustCallAlias @Nullable ServerSocketChannel getChannel(@MustCallAlias ServerSocket this) { return null; } diff --git a/src/java.base/share/classes/java/net/Socket.java b/src/java.base/share/classes/java/net/Socket.java index 4f23170743e78..fc1e98e301dc6 100644 --- a/src/java.base/share/classes/java/net/Socket.java +++ b/src/java.base/share/classes/java/net/Socket.java @@ -237,7 +237,7 @@ public Socket(Proxy proxy) { * * @since 1.1 */ - protected Socket(SocketImpl impl) throws SocketException { + protected Socket(@Nullable SocketImpl impl) throws SocketException { checkPermission(impl); this.impl = impl; } diff --git a/src/java.base/share/classes/java/net/SocketOption.java b/src/java.base/share/classes/java/net/SocketOption.java index 2ccf57f5f33b2..f25a0325ef0c0 100644 --- a/src/java.base/share/classes/java/net/SocketOption.java +++ b/src/java.base/share/classes/java/net/SocketOption.java @@ -25,6 +25,8 @@ package java.net; +import org.checkerframework.framework.qual.AnnotatedFor; + /** * A socket option associated with a socket. * @@ -40,7 +42,7 @@ * * @see StandardSocketOptions */ - +@AnnotatedFor({"nullness"}) public interface SocketOption { /** From cbf4281388897a9d92961e74e85e91dad48a23b4 Mon Sep 17 00:00:00 2001 From: Aosen Xiong <82676488+Ao-senXiong@users.noreply.github.com> Date: Sat, 30 Sep 2023 15:57:38 -0400 Subject: [PATCH 43/50] Use new `PolyInitialized` qualifier (#39) Co-authored-by: Werner Dietl --- .../share/classes/java/lang/Throwable.java | 4 +-- .../initialization/qual/PolyInitialized.java | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/java.base/share/classes/org/checkerframework/checker/initialization/qual/PolyInitialized.java diff --git a/src/java.base/share/classes/java/lang/Throwable.java b/src/java.base/share/classes/java/lang/Throwable.java index bc8a4fee78b50..38660ba9ffa85 100644 --- a/src/java.base/share/classes/java/lang/Throwable.java +++ b/src/java.base/share/classes/java/lang/Throwable.java @@ -25,7 +25,7 @@ package java.lang; -import org.checkerframework.checker.initialization.qual.UnknownInitialization; +import org.checkerframework.checker.initialization.qual.PolyInitialized; import org.checkerframework.checker.interning.qual.UsesObjectEquals; import org.checkerframework.checker.lock.qual.GuardSatisfied; import org.checkerframework.checker.nullness.qual.Nullable; @@ -474,7 +474,7 @@ protected Throwable(@Nullable String message, @Nullable Throwable cause, * been called on this throwable. * @since 1.4 */ - public synchronized @UnknownInitialization Throwable initCause(@UnknownInitialization Throwable this, @Nullable Throwable cause) { + public synchronized @PolyInitialized Throwable initCause(@PolyInitialized Throwable this, @Nullable Throwable cause) { if (this.cause != this) throw new IllegalStateException("Can't overwrite cause with " + Objects.toString(cause, "a null"), this); diff --git a/src/java.base/share/classes/org/checkerframework/checker/initialization/qual/PolyInitialized.java b/src/java.base/share/classes/org/checkerframework/checker/initialization/qual/PolyInitialized.java new file mode 100644 index 0000000000000..529f322d8ad3d --- /dev/null +++ b/src/java.base/share/classes/org/checkerframework/checker/initialization/qual/PolyInitialized.java @@ -0,0 +1,27 @@ +package org.checkerframework.checker.initialization.qual; + +import org.checkerframework.framework.qual.PolymorphicQualifier; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * A polymorphic qualifier for the freedom-before-commitment initialization tracking type-system. + * + *

Any method written using {@link PolyInitialized} conceptually has multiple versions: one in + * which all instances of {@link PolyInitialized} in the method signature have been replaced by one + * of the following qualifiers: {@link Initialized}; {@link UnknownInitialization} and {@link + * UnderInitialization}, which take a class argument to represent different type frames; and {@link + * FBCBottom}. + * + * @checker_framework.manual #initialization-checker Initialization Checker + * @checker_framework.manual #qualifier-polymorphism Qualifier polymorphism + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) +@PolymorphicQualifier(UnknownInitialization.class) +public @interface PolyInitialized {} From 7f2fadb5a25115bef34ad5599aa9a4de273f224a Mon Sep 17 00:00:00 2001 From: Suzanne Millstein Date: Thu, 5 Oct 2023 08:02:59 -0700 Subject: [PATCH 44/50] Annotated javax.lang.model.util.Types for nullness. (#179) --- .../share/classes/javax/lang/model/util/Types.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/java.compiler/share/classes/javax/lang/model/util/Types.java b/src/java.compiler/share/classes/javax/lang/model/util/Types.java index 1206c9e0d76bb..7e65d7584d74f 100644 --- a/src/java.compiler/share/classes/javax/lang/model/util/Types.java +++ b/src/java.compiler/share/classes/javax/lang/model/util/Types.java @@ -25,7 +25,9 @@ package javax.lang.model.util; +import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.dataflow.qual.Pure; +import org.checkerframework.framework.qual.AnnotatedFor; import java.lang.annotation.Annotation; import java.lang.annotation.AnnotationTypeMismatchException; import java.lang.annotation.IncompleteAnnotationException; @@ -45,6 +47,7 @@ * @see javax.annotation.processing.ProcessingEnvironment#getTypeUtils * @since 1.6 */ +@AnnotatedFor("nullness") public interface Types { /** @@ -56,7 +59,7 @@ public interface Types { * @param t the type to map to an element * @return the element corresponding to the given type */ - Element asElement(TypeMirror t); + @Nullable Element asElement(TypeMirror t); /** * Tests whether two {@code TypeMirror} objects represent the same type. @@ -235,8 +238,8 @@ public interface Types { * @param superBound the super (lower) bound, or {@code null} if none * @throws IllegalArgumentException if bounds are not valid */ - WildcardType getWildcardType(TypeMirror extendsBound, - TypeMirror superBound); + WildcardType getWildcardType(@Nullable TypeMirror extendsBound, + @Nullable TypeMirror superBound); /** * {@return the type corresponding to a type element and @@ -292,7 +295,7 @@ WildcardType getWildcardType(TypeMirror extendsBound, * type arguments are given, or if an inappropriate type * argument, type element, or containing type is provided */ - DeclaredType getDeclaredType(DeclaredType containing, + DeclaredType getDeclaredType(@Nullable DeclaredType containing, TypeElement typeElem, TypeMirror... typeArgs); /** From 2e95e326158c52cde2446018695835838209da93 Mon Sep 17 00:00:00 2001 From: Michael Ernst Date: Sat, 21 Oct 2023 08:47:22 -0700 Subject: [PATCH 45/50] Add Optional annotations for primitive numeric Optional wrappers --- .../classes/java/util/OptionalDouble.java | 24 +++++++++++++++---- .../share/classes/java/util/OptionalInt.java | 23 ++++++++++++++---- .../share/classes/java/util/OptionalLong.java | 23 ++++++++++++++---- 3 files changed, 55 insertions(+), 15 deletions(-) diff --git a/src/java.base/share/classes/java/util/OptionalDouble.java b/src/java.base/share/classes/java/util/OptionalDouble.java index bb800d4dba41f..2d30c804de124 100644 --- a/src/java.base/share/classes/java/util/OptionalDouble.java +++ b/src/java.base/share/classes/java/util/OptionalDouble.java @@ -27,9 +27,13 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.optional.qual.Present; import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.dataflow.qual.SideEffectFree; import org.checkerframework.framework.qual.AnnotatedFor; +import org.checkerframework.framework.qual.EnsuresQualifier; +import org.checkerframework.framework.qual.EnsuresQualifierIf; + import java.util.function.DoubleConsumer; import java.util.function.DoubleSupplier; @@ -62,9 +66,9 @@ * * @since 1.8 */ -@AnnotatedFor({"lock", "nullness"}) +@AnnotatedFor({"lock", "nullness", "optional"}) @jdk.internal.ValueBased -public final class OptionalDouble { +public final @NonNull class OptionalDouble { /** * Common instance for {@code empty()}. */ @@ -120,7 +124,8 @@ private OptionalDouble(double value) { * @param value the value to describe * @return an {@code OptionalDouble} with the value present */ - public static OptionalDouble of(double value) { + @SideEffectFree + public static @Present OptionalDouble of(double value) { return new OptionalDouble(value); } @@ -134,7 +139,8 @@ public static OptionalDouble of(double value) { * @return the value described by this {@code OptionalDouble} * @throws NoSuchElementException if no value is present */ - public double getAsDouble() { + @Pure + public double getAsDouble(@Present OptionalDouble this) { if (!isPresent) { throw new NoSuchElementException("No value present"); } @@ -146,6 +152,8 @@ public double getAsDouble() { * * @return {@code true} if a value is present, otherwise {@code false} */ + @Pure + @EnsuresQualifierIf(result = true, expression = "this", qualifier = Present.class) public boolean isPresent() { return isPresent; } @@ -158,6 +166,7 @@ public boolean isPresent() { * @since 11 */ @Pure + @EnsuresQualifierIf(result = false, expression = "this", qualifier = Present.class) public boolean isEmpty() { return !isPresent; } @@ -212,6 +221,7 @@ public void ifPresentOrElse(DoubleConsumer action, Runnable emptyAction) { * @return the optional value as a {@code DoubleStream} * @since 9 */ + @SideEffectFree public DoubleStream stream() { if (isPresent) { return DoubleStream.of(value); @@ -253,7 +263,9 @@ public double orElseGet(DoubleSupplier supplier) { * @throws NoSuchElementException if no value is present * @since 10 */ - public double orElseThrow() { + @Pure + @EnsuresQualifier(expression = "this", qualifier = Present.class) + public double orElseThrow(@Present OptionalDouble this) { if (!isPresent) { throw new NoSuchElementException("No value present"); } @@ -277,6 +289,7 @@ public double orElseThrow() { * @throws NullPointerException if no value is present and the exception * supplying function is {@code null} */ + @EnsuresQualifier(expression = "this", qualifier = Present.class) public double orElseThrow(Supplier exceptionSupplier) throws X { if (isPresent) { return value; @@ -320,6 +333,7 @@ public boolean equals(@Nullable Object obj) { * @return hash code value of the present value or {@code 0} if no value is * present */ + @Pure @Override public int hashCode() { return isPresent ? Double.hashCode(value) : 0; diff --git a/src/java.base/share/classes/java/util/OptionalInt.java b/src/java.base/share/classes/java/util/OptionalInt.java index 669345f309d6c..633c06d7abfdd 100644 --- a/src/java.base/share/classes/java/util/OptionalInt.java +++ b/src/java.base/share/classes/java/util/OptionalInt.java @@ -27,9 +27,12 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.optional.qual.Present; import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.dataflow.qual.SideEffectFree; import org.checkerframework.framework.qual.AnnotatedFor; +import org.checkerframework.framework.qual.EnsuresQualifier; +import org.checkerframework.framework.qual.EnsuresQualifierIf; import java.util.function.IntConsumer; import java.util.function.IntSupplier; @@ -62,9 +65,9 @@ * * @since 1.8 */ -@AnnotatedFor({"lock", "nullness"}) +@AnnotatedFor({"lock", "nullness", "optional"}) @jdk.internal.ValueBased -public final class OptionalInt { +public final @NonNull class OptionalInt { /** * Common instance for {@code empty()}. */ @@ -120,7 +123,8 @@ private OptionalInt(int value) { * @param value the value to describe * @return an {@code OptionalInt} with the value present */ - public static OptionalInt of(int value) { + @SideEffectFree + public static @Present OptionalInt of(int value) { return new OptionalInt(value); } @@ -134,7 +138,8 @@ public static OptionalInt of(int value) { * @return the value described by this {@code OptionalInt} * @throws NoSuchElementException if no value is present */ - public int getAsInt() { + @Pure + public int getAsInt(@Present OptionalInt this) { if (!isPresent) { throw new NoSuchElementException("No value present"); } @@ -146,6 +151,8 @@ public int getAsInt() { * * @return {@code true} if a value is present, otherwise {@code false} */ + @Pure + @EnsuresQualifierIf(result = true, expression = "this", qualifier = Present.class) public boolean isPresent() { return isPresent; } @@ -158,6 +165,7 @@ public boolean isPresent() { * @since 11 */ @Pure + @EnsuresQualifierIf(result = false, expression = "this", qualifier = Present.class) public boolean isEmpty() { return !isPresent; } @@ -211,6 +219,7 @@ public void ifPresentOrElse(IntConsumer action, Runnable emptyAction) { * @return the optional value as an {@code IntStream} * @since 9 */ + @SideEffectFree public IntStream stream() { if (isPresent) { return IntStream.of(value); @@ -252,7 +261,9 @@ public int orElseGet(IntSupplier supplier) { * @throws NoSuchElementException if no value is present * @since 10 */ - public int orElseThrow() { + @Pure + @EnsuresQualifier(expression = "this", qualifier = Present.class) + public int orElseThrow(@Present OptionalInt this) { if (!isPresent) { throw new NoSuchElementException("No value present"); } @@ -276,6 +287,7 @@ public int orElseThrow() { * @throws NullPointerException if no value is present and the exception * supplying function is {@code null} */ + @EnsuresQualifier(expression = "this", qualifier = Present.class) public int orElseThrow(Supplier exceptionSupplier) throws X { if (isPresent) { return value; @@ -318,6 +330,7 @@ public boolean equals(@Nullable Object obj) { * @return hash code value of the present value or {@code 0} if no value is * present */ + @Pure @Override public int hashCode() { return isPresent ? Integer.hashCode(value) : 0; diff --git a/src/java.base/share/classes/java/util/OptionalLong.java b/src/java.base/share/classes/java/util/OptionalLong.java index d54316dd966c3..8449378f64caa 100644 --- a/src/java.base/share/classes/java/util/OptionalLong.java +++ b/src/java.base/share/classes/java/util/OptionalLong.java @@ -27,9 +27,12 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import org.checkerframework.checker.optional.qual.Present; import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.dataflow.qual.SideEffectFree; import org.checkerframework.framework.qual.AnnotatedFor; +import org.checkerframework.framework.qual.EnsuresQualifier; +import org.checkerframework.framework.qual.EnsuresQualifierIf; import java.util.function.LongConsumer; import java.util.function.LongSupplier; @@ -62,9 +65,9 @@ * * @since 1.8 */ -@AnnotatedFor({"lock", "nullness"}) +@AnnotatedFor({"lock", "nullness", "optional"}) @jdk.internal.ValueBased -public final class OptionalLong { +public final @NonNull class OptionalLong { /** * Common instance for {@code empty()}. */ @@ -120,7 +123,8 @@ private OptionalLong(long value) { * @param value the value to describe * @return an {@code OptionalLong} with the value present */ - public static OptionalLong of(long value) { + @SideEffectFree + public static @Present OptionalLong of(long value) { return new OptionalLong(value); } @@ -134,7 +138,8 @@ public static OptionalLong of(long value) { * @return the value described by this {@code OptionalLong} * @throws NoSuchElementException if no value is present */ - public long getAsLong() { + @Pure + public long getAsLong(@Present OptionalLong this) { if (!isPresent) { throw new NoSuchElementException("No value present"); } @@ -146,6 +151,8 @@ public long getAsLong() { * * @return {@code true} if a value is present, otherwise {@code false} */ + @Pure + @EnsuresQualifierIf(result = true, expression = "this", qualifier = Present.class) public boolean isPresent() { return isPresent; } @@ -158,6 +165,7 @@ public boolean isPresent() { * @since 11 */ @Pure + @EnsuresQualifierIf(result = false, expression = "this", qualifier = Present.class) public boolean isEmpty() { return !isPresent; } @@ -211,6 +219,7 @@ public void ifPresentOrElse(LongConsumer action, Runnable emptyAction) { * @return the optional value as an {@code LongStream} * @since 9 */ + @SideEffectFree public LongStream stream() { if (isPresent) { return LongStream.of(value); @@ -252,7 +261,9 @@ public long orElseGet(LongSupplier supplier) { * @throws NoSuchElementException if no value is present * @since 10 */ - public long orElseThrow() { + @Pure + @EnsuresQualifier(expression = "this", qualifier = Present.class) + public long orElseThrow(@Present OptionalLong this) { if (!isPresent) { throw new NoSuchElementException("No value present"); } @@ -276,6 +287,7 @@ public long orElseThrow() { * @throws NullPointerException if no value is present and the exception * supplying function is {@code null} */ + @EnsuresQualifier(expression = "this", qualifier = Present.class) public long orElseThrow(Supplier exceptionSupplier) throws X { if (isPresent) { return value; @@ -318,6 +330,7 @@ public boolean equals(@Nullable Object obj) { * @return hash code value of the present value or {@code 0} if no value is * present */ + @Pure @Override public int hashCode() { return isPresent ? Long.hashCode(value) : 0; From 1973fa0811588dd0bb025fdc99345cdb887b3b52 Mon Sep 17 00:00:00 2001 From: Michael Ernst Date: Sat, 21 Oct 2023 09:44:16 -0700 Subject: [PATCH 46/50] Receiver of `orElseThrow(Supplier)` is `@MaybePresent` --- src/java.base/share/classes/java/util/Optional.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/java.base/share/classes/java/util/Optional.java b/src/java.base/share/classes/java/util/Optional.java index 67a79cfb949b3..13343452a70d6 100644 --- a/src/java.base/share/classes/java/util/Optional.java +++ b/src/java.base/share/classes/java/util/Optional.java @@ -434,8 +434,10 @@ public T orElseThrow(@Present Optional this) { * @throws NullPointerException if no value is present and the exception * supplying function is {@code null} */ + @CFComment({"optional: orElseThrow(Supplier) does not throw NoSuchElementException, so its receiver is @MaybePresent.", + "Contrast with orElseThrow(), defined just above, whose receiver is @Present."}) @EnsuresQualifier(expression = "this", qualifier = Present.class) - public T orElseThrow(@Present Optional this, Supplier exceptionSupplier) throws X { + public T orElseThrow(Supplier exceptionSupplier) throws X { if (value != null) { return value; } else { From 900f1dbddaf509648a319bf71a22e4c461002724 Mon Sep 17 00:00:00 2001 From: Werner Dietl Date: Thu, 23 Nov 2023 00:44:42 -0500 Subject: [PATCH 47/50] Remove redundant @NonNull annotations --- .../share/classes/java/util/Map.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/java.base/share/classes/java/util/Map.java b/src/java.base/share/classes/java/util/Map.java index dbea5ff0a59c8..53732d4aca7f6 100644 --- a/src/java.base/share/classes/java/util/Map.java +++ b/src/java.base/share/classes/java/util/Map.java @@ -641,7 +641,7 @@ public static Comparator> comparingByValue(Comparator Map.Entry copyOf(Map.Entry e) { + public static Map.Entry copyOf(Map.Entry e) { Objects.requireNonNull(e); if (e instanceof KeyValueHolder) { return (Map.Entry) e; @@ -1395,7 +1395,7 @@ static Map of() { * * @since 9 */ - static Map of(K k1, V v1) { + static Map of(K k1, V v1) { return new ImmutableCollections.Map1<>(k1, v1); } @@ -1415,7 +1415,7 @@ static Map of() { * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2) { + static Map of(K k1, V v1, K k2, V v2) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2); } @@ -1437,7 +1437,7 @@ static Map of() { * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3) { + static Map of(K k1, V v1, K k2, V v2, K k3, V v3) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3); } @@ -1461,7 +1461,7 @@ static Map of() { * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) { + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4); } @@ -1487,7 +1487,7 @@ static Map of() { * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) { + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5); } @@ -1515,7 +1515,7 @@ static Map of() { * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6); @@ -1547,7 +1547,7 @@ static Map of() { * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7); @@ -1581,7 +1581,7 @@ static Map of() { * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8); @@ -1617,7 +1617,7 @@ static Map of() { * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9); @@ -1655,7 +1655,7 @@ static Map of() { * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10); @@ -1694,7 +1694,7 @@ static Map of() { */ @SafeVarargs @SuppressWarnings("varargs") - static Map ofEntries(Entry... entries) { + static Map ofEntries(Entry... entries) { if (entries.length == 0) { // implicit null check of entries array @SuppressWarnings("unchecked") var map = (Map) ImmutableCollections.EMPTY_MAP; @@ -1750,7 +1750,7 @@ static Map of() { * @see Map#ofEntries Map.ofEntries() * @since 9 */ - static Entry entry(@NonNull K k, @NonNull V v) { + static Entry entry(K k, V v) { // KeyValueHolder checks for nulls return new KeyValueHolder<>(k, v); } @@ -1773,7 +1773,7 @@ static Map of() { * @since 10 */ @SuppressWarnings({"rawtypes","unchecked"}) - static Map copyOf(Map map) { + static Map copyOf(Map map) { if (map instanceof ImmutableCollections.AbstractImmutableMap) { return (Map)map; } else { From 1e32ff5dfcab322f554e67a77ba17d5a7f6af568 Mon Sep 17 00:00:00 2001 From: Werner Dietl Date: Thu, 23 Nov 2023 00:45:10 -0500 Subject: [PATCH 48/50] Add required @NonNull annotation --- src/java.base/share/classes/java/util/Optional.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java.base/share/classes/java/util/Optional.java b/src/java.base/share/classes/java/util/Optional.java index f0bc31039af24..54964bdf9257c 100644 --- a/src/java.base/share/classes/java/util/Optional.java +++ b/src/java.base/share/classes/java/util/Optional.java @@ -437,7 +437,7 @@ public Stream stream() { @CFComment({"optional: orElseThrow(Supplier) does not throw NoSuchElementException, so its receiver is @MaybePresent.", "Contrast with orElseThrow(), defined just above, whose receiver is @Present."}) @EnsuresQualifier(expression = "this", qualifier = Present.class) - public T orElseThrow(Supplier exceptionSupplier) throws X { + public @NonNull T orElseThrow(Supplier exceptionSupplier) throws X { if (value != null) { return value; } else { From f728b156f9a5de3e4272cfac2a4e3c879b15f668 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Thu, 23 Nov 2023 23:34:07 -0500 Subject: [PATCH 49/50] Remove unnecessary `@NonNull` usages from `>`. (#75) --- src/java.base/share/classes/java/util/Comparator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java.base/share/classes/java/util/Comparator.java b/src/java.base/share/classes/java/util/Comparator.java index ee7b940507590..bf78e9ee20c9e 100644 --- a/src/java.base/share/classes/java/util/Comparator.java +++ b/src/java.base/share/classes/java/util/Comparator.java @@ -368,7 +368,7 @@ public static > Comparator reverseOrder() { * @since 1.8 */ @SuppressWarnings("unchecked") - public static > Comparator naturalOrder() { + public static > Comparator naturalOrder() { return (Comparator) Comparators.NaturalOrderComparator.INSTANCE; } From 54bd74a6ca1c8462001cda34720c76888b023864 Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Thu, 23 Nov 2023 23:34:27 -0500 Subject: [PATCH 50/50] Remove redundant upper bound. (#74) --- src/java.base/share/classes/java/util/Comparator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/java/util/Comparator.java b/src/java.base/share/classes/java/util/Comparator.java index bf78e9ee20c9e..bb20647d38727 100644 --- a/src/java.base/share/classes/java/util/Comparator.java +++ b/src/java.base/share/classes/java/util/Comparator.java @@ -389,7 +389,7 @@ public static > Comparator naturalOrder() { * {@code Comparator}. * @since 1.8 */ - public static Comparator<@Nullable T> nullsFirst(@Nullable Comparator<@Nullable ? super T> comparator) { + public static Comparator<@Nullable T> nullsFirst(@Nullable Comparator comparator) { return new Comparators.NullComparator<>(true, comparator); } @@ -410,7 +410,7 @@ public static > Comparator naturalOrder() { * {@code Comparator}. * @since 1.8 */ - public static Comparator<@Nullable T> nullsLast(@Nullable Comparator<@Nullable ? super T> comparator) { + public static Comparator<@Nullable T> nullsLast(@Nullable Comparator comparator) { return new Comparators.NullComparator<>(false, comparator); }