From 021f7bd9391a0ebf90a01792e9199c551e80897f Mon Sep 17 00:00:00 2001 From: Ahnaf Shahriar Date: Sat, 5 Jul 2025 14:57:18 -0400 Subject: [PATCH 1/6] #1107: Adding example for wrong checker qualifier crash. --- docs/examples/Makefile | 3 + docs/examples/Wrong-Checker-Qual/Makefile | 16 +++++ docs/examples/Wrong-Checker-Qual/build.gradle | 60 +++++++++++++++++++ .../Wrong-Checker-Qual/settings.gradle | 0 .../src/main/java/com/example/Demo.java | 10 ++++ 5 files changed, 89 insertions(+) create mode 100644 docs/examples/Wrong-Checker-Qual/Makefile create mode 100644 docs/examples/Wrong-Checker-Qual/build.gradle create mode 100644 docs/examples/Wrong-Checker-Qual/settings.gradle create mode 100644 docs/examples/Wrong-Checker-Qual/src/main/java/com/example/Demo.java diff --git a/docs/examples/Makefile b/docs/examples/Makefile index b9b563bcc784..e05f6b4bcd47 100644 --- a/docs/examples/Makefile +++ b/docs/examples/Makefile @@ -13,9 +13,11 @@ compile: $(MAKE) -C MavenExample || (sleep 60 && echo "Trying again:" && $(MAKE) -C MavenExample) $(MAKE) -C lombok $(MAKE) -C errorprone + $(MAKE) -C Wrong-Checker-Qual $(MAKE) -C BazelExample $(MAKE) -C jspecify + # TODO: type check the different files with the right checker; # some tests expect errors, compare against expected errors. @@ -27,5 +29,6 @@ clean: $(MAKE) -C MavenExample clean $(MAKE) -C lombok clean $(MAKE) -C errorprone clean + $(MAKE) -C Wrong-Checker-Qual clean $(MAKE) -C BazelExample clean $(MAKE) -C jspecify clean diff --git a/docs/examples/Wrong-Checker-Qual/Makefile b/docs/examples/Wrong-Checker-Qual/Makefile new file mode 100644 index 000000000000..76c2592eb272 --- /dev/null +++ b/docs/examples/Wrong-Checker-Qual/Makefile @@ -0,0 +1,16 @@ +JAVA_VER := $(shell java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1 | sed 's/-ea//' | sed 's/-beta//') + +.PHONY: all clean + +ifeq ($(shell test $(JAVA_VER) -lt 17; echo $$?),0) +all: + @echo "Skipping test because errorprone does not work under Java ${JAVA_VER}" +else +all: + - ../../../gradlew build > Out.txt 2>&1 + grep -qF "Exception: org.checkerframework.javacutil.BugInCF:" Out.txt +endif + +clean: + - ../../../gradlew clean + rm -f Out.txt diff --git a/docs/examples/Wrong-Checker-Qual/build.gradle b/docs/examples/Wrong-Checker-Qual/build.gradle new file mode 100644 index 000000000000..adc14639e9fe --- /dev/null +++ b/docs/examples/Wrong-Checker-Qual/build.gradle @@ -0,0 +1,60 @@ +// /////////////////////////////////////////////////////////////////////////// +// Checker Framework pluggable type-checking and Error Prone example +// + +plugins { + id 'java' + id 'net.ltgt.errorprone' version '4.2.0' + // Checker Framework pluggable type-checking + id 'org.checkerframework' version '0.6.53' apply false +} + +ext { + versions = [ + eisopVersion: '3.49.3-eisop1', + ] +} + +apply plugin: 'org.checkerframework' +if (false) { + def cfHome = "${projectDir}/../../.." + dependencies { + compileOnly files(cfHome + '/checker/dist/checker-qual.jar') + testCompileOnly files(cfHome + '/checker/dist/checker-qual.jar') + checkerFramework files(cfHome + '/checker/dist/checker.jar') + } +} else { + dependencies { + // Without the proper checker qualifiers, Nullness Checker should gracefully issue warnings + // compileOnly "io.github.eisop:checker-qual:${versions.eisopVersion}" + // testCompileOnly "io.github.eisop:checker-qual:${versions.eisopVersion}" + checkerFramework "io.github.eisop:checker-qual:${versions.eisopVersion}" + checkerFramework "io.github.eisop:checker:${versions.eisopVersion}" + } +} + +dependencies { + if (JavaVersion.current() >= JavaVersion.VERSION_17) { + errorprone 'com.google.errorprone:error_prone_core:2.38.0' + } +} + +repositories { + // mavenLocal() // Use local Maven repository first for testing + mavenCentral() +} + +checkerFramework { + checkers = [ + 'org.checkerframework.checker.nullness.NullnessChecker', + ] + extraJavacArgs = ['-Aversion'] +} + +compileJava { + options.errorprone.enabled = (JavaVersion.current() >= JavaVersion.VERSION_17) + // A checker will only run if Error Prone does not issue any warnings. So + // convert the expected error to a warning to test that both Error Prone + // and the Nullness Checker run. + options.errorprone.warn('CollectionIncompatibleType') +} diff --git a/docs/examples/Wrong-Checker-Qual/settings.gradle b/docs/examples/Wrong-Checker-Qual/settings.gradle new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/docs/examples/Wrong-Checker-Qual/src/main/java/com/example/Demo.java b/docs/examples/Wrong-Checker-Qual/src/main/java/com/example/Demo.java new file mode 100644 index 000000000000..cde00ff54894 --- /dev/null +++ b/docs/examples/Wrong-Checker-Qual/src/main/java/com/example/Demo.java @@ -0,0 +1,10 @@ +package com.example; + +import java.util.Set; + +public class Demo { + void demo(Set s, short i) { + s.remove(i - 1); // Error Prone error + s.add(null); // Nullness Checker error + } +} From 325cb6a8ed2b05cc237dd060c505b8925c8f4579 Mon Sep 17 00:00:00 2001 From: Ahnaf Shahriar Date: Sat, 5 Jul 2025 14:57:56 -0400 Subject: [PATCH 2/6] Cleaning up .gitignore for easier example addition with less overhead Later --- .gitignore | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index cf16a3516abe..9bf067c40b45 100644 --- a/.gitignore +++ b/.gitignore @@ -97,11 +97,9 @@ docs/examples/BazelExample/bazel-out docs/examples/BazelExample/bazel-testlogs docs/examples/MavenExample/Out.txt docs/examples/MavenExample-framework-all/Out.txt -docs/examples/errorprone/.gradle/ docs/examples/errorprone/Out.txt -docs/examples/jspecify/.gradle/ +docs/examples/Wrong-Checker-Qual/Out.txt docs/examples/jspecify/Out.txt -docs/examples/lombok/.gradle/ docs/examples/lombok/Out.txt docs/examples/lombok/lombok.config docs/manual/*.png @@ -121,9 +119,7 @@ target/ *.ipr *.iws *.iml -/.gradle/ -# TODO: why this second gradle directory? -/buildSrc/.gradle/ +.gradle/ ## Tests From 0cb6d74435728da0702f34f5d925b85e8a05731e Mon Sep 17 00:00:00 2001 From: Ahnaf Shahriar <70302254+ShahriarAhnaf@users.noreply.github.com> Date: Mon, 7 Jul 2025 18:17:34 -0400 Subject: [PATCH 3/6] Update .gitignore for organization Co-authored-by: Werner Dietl --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 5e4f5f765e6b..f519effebd54 100644 --- a/.gitignore +++ b/.gitignore @@ -121,6 +121,8 @@ target/ *.ipr *.iws *.iml + +# Gradle files .gradle/ ## Tests From 863cc485ee48aa4af07918603e5d33ec07fc5d09 Mon Sep 17 00:00:00 2001 From: Ahnaf Shahriar Date: Mon, 7 Jul 2025 18:22:47 -0400 Subject: [PATCH 4/6] applying changes to example name and attemping version mismatch for qualifiers instead of dependencies --- docs/examples/Makefile | 4 +- docs/examples/Wrong-Checker-Qual/build.gradle | 60 ------------------- .../Makefile | 1 + .../mismatched-checker-qual/build.gradle | 38 ++++++++++++ .../settings.gradle | 0 .../src/main/java/com/example/Demo.java | 0 6 files changed, 41 insertions(+), 62 deletions(-) delete mode 100644 docs/examples/Wrong-Checker-Qual/build.gradle rename docs/examples/{Wrong-Checker-Qual => mismatched-checker-qual}/Makefile (89%) create mode 100644 docs/examples/mismatched-checker-qual/build.gradle rename docs/examples/{Wrong-Checker-Qual => mismatched-checker-qual}/settings.gradle (100%) rename docs/examples/{Wrong-Checker-Qual => mismatched-checker-qual}/src/main/java/com/example/Demo.java (100%) diff --git a/docs/examples/Makefile b/docs/examples/Makefile index 24b7133ae532..3cc843cc88c6 100644 --- a/docs/examples/Makefile +++ b/docs/examples/Makefile @@ -13,10 +13,10 @@ compile: $(MAKE) -C MavenExample || (sleep 60 && echo "Trying again:" && $(MAKE) -C MavenExample) $(MAKE) -C lombok $(MAKE) -C errorprone - $(MAKE) -C Wrong-Checker-Qual $(MAKE) -C BazelExample $(MAKE) -C nullaway $(MAKE) -C jspecify + $(MAKE) -C mismatched-checker-qual # TODO: type check the different files with the right checker; @@ -30,7 +30,7 @@ clean: $(MAKE) -C MavenExample clean $(MAKE) -C lombok clean $(MAKE) -C errorprone clean - $(MAKE) -C Wrong-Checker-Qual clean $(MAKE) -C BazelExample clean $(MAKE) -C nullaway clean $(MAKE) -C jspecify clean + $(MAKE) -C mismatched-checker-qual clean \ No newline at end of file diff --git a/docs/examples/Wrong-Checker-Qual/build.gradle b/docs/examples/Wrong-Checker-Qual/build.gradle deleted file mode 100644 index adc14639e9fe..000000000000 --- a/docs/examples/Wrong-Checker-Qual/build.gradle +++ /dev/null @@ -1,60 +0,0 @@ -// /////////////////////////////////////////////////////////////////////////// -// Checker Framework pluggable type-checking and Error Prone example -// - -plugins { - id 'java' - id 'net.ltgt.errorprone' version '4.2.0' - // Checker Framework pluggable type-checking - id 'org.checkerframework' version '0.6.53' apply false -} - -ext { - versions = [ - eisopVersion: '3.49.3-eisop1', - ] -} - -apply plugin: 'org.checkerframework' -if (false) { - def cfHome = "${projectDir}/../../.." - dependencies { - compileOnly files(cfHome + '/checker/dist/checker-qual.jar') - testCompileOnly files(cfHome + '/checker/dist/checker-qual.jar') - checkerFramework files(cfHome + '/checker/dist/checker.jar') - } -} else { - dependencies { - // Without the proper checker qualifiers, Nullness Checker should gracefully issue warnings - // compileOnly "io.github.eisop:checker-qual:${versions.eisopVersion}" - // testCompileOnly "io.github.eisop:checker-qual:${versions.eisopVersion}" - checkerFramework "io.github.eisop:checker-qual:${versions.eisopVersion}" - checkerFramework "io.github.eisop:checker:${versions.eisopVersion}" - } -} - -dependencies { - if (JavaVersion.current() >= JavaVersion.VERSION_17) { - errorprone 'com.google.errorprone:error_prone_core:2.38.0' - } -} - -repositories { - // mavenLocal() // Use local Maven repository first for testing - mavenCentral() -} - -checkerFramework { - checkers = [ - 'org.checkerframework.checker.nullness.NullnessChecker', - ] - extraJavacArgs = ['-Aversion'] -} - -compileJava { - options.errorprone.enabled = (JavaVersion.current() >= JavaVersion.VERSION_17) - // A checker will only run if Error Prone does not issue any warnings. So - // convert the expected error to a warning to test that both Error Prone - // and the Nullness Checker run. - options.errorprone.warn('CollectionIncompatibleType') -} diff --git a/docs/examples/Wrong-Checker-Qual/Makefile b/docs/examples/mismatched-checker-qual/Makefile similarity index 89% rename from docs/examples/Wrong-Checker-Qual/Makefile rename to docs/examples/mismatched-checker-qual/Makefile index 76c2592eb272..59e26350b2f2 100644 --- a/docs/examples/Wrong-Checker-Qual/Makefile +++ b/docs/examples/mismatched-checker-qual/Makefile @@ -8,6 +8,7 @@ all: else all: - ../../../gradlew build > Out.txt 2>&1 + # Check for crash due to mismatched Checker Qualifiers grep -qF "Exception: org.checkerframework.javacutil.BugInCF:" Out.txt endif diff --git a/docs/examples/mismatched-checker-qual/build.gradle b/docs/examples/mismatched-checker-qual/build.gradle new file mode 100644 index 000000000000..cb603e4d0da1 --- /dev/null +++ b/docs/examples/mismatched-checker-qual/build.gradle @@ -0,0 +1,38 @@ +// /////////////////////////////////////////////////////////////////////////// +// Checker Framework pluggable type-checking and Error Prone example +// + +plugins { + id 'java' + // Checker Framework pluggable type-checking + id 'org.checkerframework' version '0.6.53' apply false +} + +ext { + versions = [ + eisopVersion: '3.49.3-eisop1', + eisopQualVersion: '3.42.0-eisop1', + ] +} + +apply plugin: 'org.checkerframework' + +dependencies { + // Without the proper checker qualifiers, Nullness Checker should gracefully issue warnings + compileOnly "io.github.eisop:checker-qual:${versions.eisopQualVersion}" + testCompileOnly "io.github.eisop:checker-qual:${versions.eisopQualVersion}" + checkerFramework "io.github.eisop:checker-qual:${versions.eisopVersion}" + checkerFramework "io.github.eisop:checker:${versions.eisopVersion}" +} + +repositories { + // mavenLocal() // Use local Maven repository first for testing + mavenCentral() +} + +checkerFramework { + checkers = [ + 'org.checkerframework.checker.nullness.NullnessChecker', + ] + extraJavacArgs = ['-Aversion'] +} \ No newline at end of file diff --git a/docs/examples/Wrong-Checker-Qual/settings.gradle b/docs/examples/mismatched-checker-qual/settings.gradle similarity index 100% rename from docs/examples/Wrong-Checker-Qual/settings.gradle rename to docs/examples/mismatched-checker-qual/settings.gradle diff --git a/docs/examples/Wrong-Checker-Qual/src/main/java/com/example/Demo.java b/docs/examples/mismatched-checker-qual/src/main/java/com/example/Demo.java similarity index 100% rename from docs/examples/Wrong-Checker-Qual/src/main/java/com/example/Demo.java rename to docs/examples/mismatched-checker-qual/src/main/java/com/example/Demo.java From a2c359cfbeb2da414f7820f0ced0df58dbb060a4 Mon Sep 17 00:00:00 2001 From: Ahnaf Shahriar Date: Mon, 7 Jul 2025 18:28:23 -0400 Subject: [PATCH 5/6] update contributers for pull request checks --- docs/manual/contributors.tex | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/manual/contributors.tex b/docs/manual/contributors.tex index 8852dac7fe13..579eabdc26e2 100644 --- a/docs/manual/contributors.tex +++ b/docs/manual/contributors.tex @@ -1,6 +1,7 @@ Abraham Lin, Adian Qian, Aditya Singh, +Ahnaf Shahriar, Akash Srivastava, Alex Cook, Alex Liu, From 42024f85fb755a870a2947ca75dad7da4f188c7a Mon Sep 17 00:00:00 2001 From: Ahnaf Shahriar Date: Mon, 7 Jul 2025 18:39:13 -0400 Subject: [PATCH 6/6] using typetools qualifiers to cause the subpackage missing crash --- docs/examples/mismatched-checker-qual/build.gradle | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/examples/mismatched-checker-qual/build.gradle b/docs/examples/mismatched-checker-qual/build.gradle index cb603e4d0da1..05e4698305b5 100644 --- a/docs/examples/mismatched-checker-qual/build.gradle +++ b/docs/examples/mismatched-checker-qual/build.gradle @@ -1,5 +1,7 @@ // /////////////////////////////////////////////////////////////////////////// -// Checker Framework pluggable type-checking and Error Prone example +// Checker Framework pluggable type-checking +// Mismatched Checker Qualifiers Example +// Having the Wrong qualifiers in the classpath will cause a crash // plugins { @@ -11,16 +13,16 @@ plugins { ext { versions = [ eisopVersion: '3.49.3-eisop1', - eisopQualVersion: '3.42.0-eisop1', ] } apply plugin: 'org.checkerframework' dependencies { - // Without the proper checker qualifiers, Nullness Checker should gracefully issue warnings - compileOnly "io.github.eisop:checker-qual:${versions.eisopQualVersion}" - testCompileOnly "io.github.eisop:checker-qual:${versions.eisopQualVersion}" + // Without the same checker qualifiers, Nullness Checker should gracefully issue warnings + // Use Typetools checker-qual (original) for qualifiers + compileOnly "org.checkerframework:checker-qual:3.49.1" + testCompileOnly "org.checkerframework:checker-qual:3.49.1" checkerFramework "io.github.eisop:checker-qual:${versions.eisopVersion}" checkerFramework "io.github.eisop:checker:${versions.eisopVersion}" }