From 34460fcc95a2977ae200d884aae08bd1c485e2e2 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Tue, 1 Jul 2025 15:57:17 -0400 Subject: [PATCH 1/3] No bytecode storage --- .../org/checkerframework/framework/qual/AnnotatedFor.java | 2 +- docs/CHANGELOG.md | 3 +++ .../checkerframework/framework/source/SourceChecker.java | 4 ++++ .../framework/type/AnnotatedTypeFactory.java | 6 ++++-- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/checker-qual/src/main/java/org/checkerframework/framework/qual/AnnotatedFor.java b/checker-qual/src/main/java/org/checkerframework/framework/qual/AnnotatedFor.java index 48c4f7ab47f7..135da508f9c9 100644 --- a/checker-qual/src/main/java/org/checkerframework/framework/qual/AnnotatedFor.java +++ b/checker-qual/src/main/java/org/checkerframework/framework/qual/AnnotatedFor.java @@ -26,7 +26,7 @@ * @checker_framework.manual #compiling-libraries Compiling partially-annotated libraries */ @Documented -@Retention(RetentionPolicy.SOURCE) +@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.PACKAGE}) public @interface AnnotatedFor { /** diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index a4f0239d940c..2d246bc16a1e 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -3,6 +3,9 @@ Version 3.49.3-eisop2 (June ??, 2025) **User-visible changes:** +The new command-line option '-AnoBytecodeStorage' configures the Checker Framework to not store defaulted annotations in +bytecode. + The Nullness Checker now has more fine-grained prefix options to suppress warnings: - `@SuppressWarnings("nullness")` is used to suppress warnings from the Nullness, Initialization, and KeyFor Checkers. - `@SuppressWarnings("nullnesskeyfor")` is used to suppress warnings from the Nullness and KeyFor Checkers, diff --git a/framework/src/main/java/org/checkerframework/framework/source/SourceChecker.java b/framework/src/main/java/org/checkerframework/framework/source/SourceChecker.java index 11709a6877b8..edb2437f51d1 100644 --- a/framework/src/main/java/org/checkerframework/framework/source/SourceChecker.java +++ b/framework/src/main/java/org/checkerframework/framework/source/SourceChecker.java @@ -201,6 +201,10 @@ // org.checkerframework.framework.source.SourceChecker.useConservativeDefault "useConservativeDefaultsForUncheckedCode", + // Whether to store defaulted annotations in bytecode. + // org.checkerframework.framework.type.AnnotatedTypeFactory.postProcessClassTree + "noBytecodeStorage", + // Whether to assume sound concurrent semantics or // simplified sequential semantics // org.checkerframework.framework.flow.CFAbstractTransfer.sequentialSemantics diff --git a/framework/src/main/java/org/checkerframework/framework/type/AnnotatedTypeFactory.java b/framework/src/main/java/org/checkerframework/framework/type/AnnotatedTypeFactory.java index d5154b2991e9..addd507f10bf 100644 --- a/framework/src/main/java/org/checkerframework/framework/type/AnnotatedTypeFactory.java +++ b/framework/src/main/java/org/checkerframework/framework/type/AnnotatedTypeFactory.java @@ -1530,8 +1530,10 @@ public void preProcessClassTree(ClassTree classTree) {} * to override this method if storing defaulted types is not desirable. */ public void postProcessClassTree(ClassTree tree) { - TypesIntoElements.store(processingEnv, this, tree); - DeclarationsIntoElements.store(processingEnv, this, tree); + if (!checker.hasOption("noBytecodeStorage")) { + TypesIntoElements.store(processingEnv, this, tree); + DeclarationsIntoElements.store(processingEnv, this, tree); + } if (typeInformationPresenter != null) { typeInformationPresenter.process(tree, getPath(tree)); From 016998860c5a6e950b69714142a27c047ebc9588 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Wed, 2 Jul 2025 22:10:55 -0400 Subject: [PATCH 2/3] Javadoc --- .../checkerframework/framework/type/AnnotatedTypeFactory.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/src/main/java/org/checkerframework/framework/type/AnnotatedTypeFactory.java b/framework/src/main/java/org/checkerframework/framework/type/AnnotatedTypeFactory.java index addd507f10bf..ad242c776ea8 100644 --- a/framework/src/main/java/org/checkerframework/framework/type/AnnotatedTypeFactory.java +++ b/framework/src/main/java/org/checkerframework/framework/type/AnnotatedTypeFactory.java @@ -1528,6 +1528,8 @@ public void preProcessClassTree(ClassTree classTree) {} *

The default implementation uses this to store the defaulted AnnotatedTypeMirrors and * inherited declaration annotations back into the corresponding Elements. Subclasses might want * to override this method if storing defaulted types is not desirable. + * + * @param tree the ClassTree that has been processed */ public void postProcessClassTree(ClassTree tree) { if (!checker.hasOption("noBytecodeStorage")) { From 5d4b9b9e5c8fd858cee8a35cd8bd640720769c05 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Wed, 2 Jul 2025 23:07:23 -0400 Subject: [PATCH 3/3] Empty commit for CI