From edf711e38456a0e996308d9fe2b1b3f5c41506f8 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Sat, 3 May 2025 08:55:25 -0400 Subject: [PATCH 01/27] Add lintoption to instanceof --- .../org/checkerframework/common/basetype/BaseTypeVisitor.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java index 5e2c0b1acf57..5137fe6db2ed 100644 --- a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java +++ b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java @@ -2917,6 +2917,9 @@ public Void visitTypeCast(TypeCastTree tree, Void p) { @Override public Void visitInstanceOf(InstanceOfTree tree, Void p) { + if (!checker.getLintOption("instanceof.unsafe", true)) { + return super.visitInstanceOf(tree, p); + } // The "reference type" is the type after "instanceof". Tree patternTree = InstanceOfUtils.getPattern(tree); if (patternTree != null) { From 2d05debe1d40d345cf0e236c901e1464ad197722 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Sat, 3 May 2025 10:33:12 -0400 Subject: [PATCH 02/27] Add the string to lintset --- .../org/checkerframework/common/basetype/BaseTypeChecker.java | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeChecker.java b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeChecker.java index 414fd4d0e176..645f93ac6c8a 100644 --- a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeChecker.java +++ b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeChecker.java @@ -215,6 +215,7 @@ protected Set createSupportedLintOptions() { lintSet.add("cast"); lintSet.add("cast:redundant"); lintSet.add("cast:unsafe"); + lintSet.add("instanceof:unsafe"); return lintSet; } From f87d22875abb3c290097cef751ccbc6fec814331 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Sat, 3 May 2025 10:53:40 -0400 Subject: [PATCH 03/27] Use correct string --- .../org/checkerframework/common/basetype/BaseTypeChecker.java | 2 +- .../org/checkerframework/common/basetype/BaseTypeVisitor.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeChecker.java b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeChecker.java index 645f93ac6c8a..75ad2bef94be 100644 --- a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeChecker.java +++ b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeChecker.java @@ -215,7 +215,7 @@ protected Set createSupportedLintOptions() { lintSet.add("cast"); lintSet.add("cast:redundant"); lintSet.add("cast:unsafe"); - lintSet.add("instanceof:unsafe"); + lintSet.add("instanceof"); return lintSet; } diff --git a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java index 5137fe6db2ed..1951a7e8d892 100644 --- a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java +++ b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java @@ -2917,7 +2917,7 @@ public Void visitTypeCast(TypeCastTree tree, Void p) { @Override public Void visitInstanceOf(InstanceOfTree tree, Void p) { - if (!checker.getLintOption("instanceof.unsafe", true)) { + if (!checker.getLintOption("instanceof", true)) { return super.visitInstanceOf(tree, p); } // The "reference type" is the type after "instanceof". From e57ef743d9d58e869c96da7327dcb77634290151 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Sat, 3 May 2025 23:09:39 -0400 Subject: [PATCH 04/27] Add manual section --- docs/manual/warnings.tex | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/manual/warnings.tex b/docs/manual/warnings.tex index e258a39f1c9b..eeec5eae94b2 100644 --- a/docs/manual/warnings.tex +++ b/docs/manual/warnings.tex @@ -725,6 +725,9 @@ \item \code{cast} Enable or disable all cast-related warnings. +\item + \code{instanceof} Enable or disable instanceof-related warnings. + \item \begin{sloppypar} \code{all} Enable or disable all lint warnings, including From 30220edab069c94a948a7bab539676172b0f867a Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Sat, 3 May 2025 23:22:59 -0400 Subject: [PATCH 05/27] Add test case --- checker/jtreg/tainting/InstanceofLintOption.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 checker/jtreg/tainting/InstanceofLintOption.java diff --git a/checker/jtreg/tainting/InstanceofLintOption.java b/checker/jtreg/tainting/InstanceofLintOption.java new file mode 100644 index 000000000000..341f1845f224 --- /dev/null +++ b/checker/jtreg/tainting/InstanceofLintOption.java @@ -0,0 +1,16 @@ +/* + * @test + * @summary Test case for instanceof lint option: -Alint=instanceof + * + * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOption.java -Alint=instanceof + */ + +import org.checkerframework.checker.tainting.qual.Untainted; + +// @below-java17-jdk-skip-test +public class InstanceofLintOption { + void bar(Object o) { + if (o instanceof @Untainted String s) {} + if (o instanceof @Untainted String) {} + } +} From 33c692b15d9885131f955182074cb0ea53a81969 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Sun, 4 May 2025 13:40:04 -0400 Subject: [PATCH 06/27] Fix log and refine tests --- .../Lintoption/InstanceofLintOptionDisabled.java | 15 +++++++++++++++ .../Lintoption/InstanceofLintOptionDisabled.out | 3 +++ .../InstanceofLintOptionEnabled.java} | 7 +++---- .../common/basetype/BaseTypeVisitor.java | 2 +- 4 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java create mode 100644 checker/jtreg/Lintoption/InstanceofLintOptionDisabled.out rename checker/jtreg/{tainting/InstanceofLintOption.java => Lintoption/InstanceofLintOptionEnabled.java} (71%) diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java b/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java new file mode 100644 index 000000000000..3956fff10069 --- /dev/null +++ b/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java @@ -0,0 +1,15 @@ +/* + * @test + * @summary Test case that issuess warnings for unsafe instanceof patterns + * @requires jdk.version >= 17 + * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionDisabled.java + */ + +import org.checkerframework.checker.tainting.qual.Untainted; + +public class InstanceofLintOptionDisabled { + void bar(Object o) { + if (o instanceof @Untainted String s) {} + if (o instanceof @Untainted String) {} + } +} diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.out b/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.out new file mode 100644 index 000000000000..2b85cd97b3c0 --- /dev/null +++ b/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.out @@ -0,0 +1,3 @@ +InstanceofLintOptionEnabled.java:12:15: warning: [instanceof.pattern.unsafe] instanceof pattern binding '@Tainted Object' to '@Untainted String s' cannot be statically verified. +InstanceofLintOptionEnabled.java:13:15: warning: [instanceof.unsafe] '@Tainted Object' instanceof '@Untainted String' cannot be statically verified. +2 warnings diff --git a/checker/jtreg/tainting/InstanceofLintOption.java b/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java similarity index 71% rename from checker/jtreg/tainting/InstanceofLintOption.java rename to checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java index 341f1845f224..f522d4d20c30 100644 --- a/checker/jtreg/tainting/InstanceofLintOption.java +++ b/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java @@ -1,14 +1,13 @@ /* * @test * @summary Test case for instanceof lint option: -Alint=instanceof - * - * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOption.java -Alint=instanceof + * @requires jdk.version >= 17 + * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=instanceof */ import org.checkerframework.checker.tainting.qual.Untainted; -// @below-java17-jdk-skip-test -public class InstanceofLintOption { +public class InstanceofLintOptionEnabled { void bar(Object o) { if (o instanceof @Untainted String s) {} if (o instanceof @Untainted String) {} diff --git a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java index 1951a7e8d892..65ca582d736e 100644 --- a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java +++ b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java @@ -2917,7 +2917,7 @@ public Void visitTypeCast(TypeCastTree tree, Void p) { @Override public Void visitInstanceOf(InstanceOfTree tree, Void p) { - if (!checker.getLintOption("instanceof", true)) { + if (checker.getLintOption("instanceof", false)) { return super.visitInstanceOf(tree, p); } // The "reference type" is the type after "instanceof". From ff6445d4c8e1f10d261ae4dcc9d34a7609502554 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Mon, 19 May 2025 22:04:04 -0400 Subject: [PATCH 07/27] Fix jtreg test --- checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java | 4 ++-- checker/jtreg/Lintoption/InstanceofLintOptionDisabled.out | 3 --- checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java | 4 ++-- checker/jtreg/Lintoption/InstanceofLintOptionEnabled.out | 4 ++++ 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 checker/jtreg/Lintoption/InstanceofLintOptionDisabled.out create mode 100644 checker/jtreg/Lintoption/InstanceofLintOptionEnabled.out diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java b/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java index 3956fff10069..99a3a9dfd023 100644 --- a/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java +++ b/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java @@ -1,8 +1,8 @@ /* * @test - * @summary Test case that issuess warnings for unsafe instanceof patterns + * @summary Test case for instanceof lint option: -Alint=-instanceof * @requires jdk.version >= 17 - * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionDisabled.java + * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=-instanceof */ import org.checkerframework.checker.tainting.qual.Untainted; diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.out b/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.out deleted file mode 100644 index 2b85cd97b3c0..000000000000 --- a/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.out +++ /dev/null @@ -1,3 +0,0 @@ -InstanceofLintOptionEnabled.java:12:15: warning: [instanceof.pattern.unsafe] instanceof pattern binding '@Tainted Object' to '@Untainted String s' cannot be statically verified. -InstanceofLintOptionEnabled.java:13:15: warning: [instanceof.unsafe] '@Tainted Object' instanceof '@Untainted String' cannot be statically verified. -2 warnings diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java b/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java index f522d4d20c30..5af6c53e4106 100644 --- a/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java +++ b/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java @@ -1,8 +1,8 @@ /* * @test - * @summary Test case for instanceof lint option: -Alint=instanceof + * Test case for instanceof lint option: -Alint=instanceof * @requires jdk.version >= 17 - * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=instanceof + * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=instanceof */ import org.checkerframework.checker.tainting.qual.Untainted; diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.out b/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.out new file mode 100644 index 000000000000..e4c0ce511a0b --- /dev/null +++ b/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.out @@ -0,0 +1,4 @@ +InstanceofLintOptionEnabled.java:12:15: compiler.warn.proc.messager: [instanceof.pattern.unsafe] instanceof pattern binding '@Tainted Object' to '@Untainted +String s' cannot be statically verified. +InstanceofLintOptionEnabled.java:13:15: compiler.warn.proc.messager: [instanceof.unsafe] '@Tainted Object' instanceof '@Untainted String' cannot be statically verified. +2 warnings From 93650de2ae21c1f4e956c888f4901cd0863f4095 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Mon, 19 May 2025 22:08:11 -0400 Subject: [PATCH 08/27] Use field to store lint option --- .../common/basetype/BaseTypeVisitor.java | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java index 65ca582d736e..5df266af946a 100644 --- a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java +++ b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java @@ -289,6 +289,18 @@ public class BaseTypeVisitor Date: Mon, 19 May 2025 22:23:36 -0400 Subject: [PATCH 09/27] Javadoc --- .../org/checkerframework/common/basetype/BaseTypeVisitor.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java index 5df266af946a..8f175a81255d 100644 --- a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java +++ b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java @@ -2729,6 +2729,8 @@ public Void visitNewArray(NewArrayTree tree, Void p) { /** * If the lint option "cast:redundant" is set, this method issues a warning if the cast is * redundant. + * + * @param typeCastTree the TypeCastTree to check */ protected void checkTypecastRedundancy(TypeCastTree typeCastTree) { if (!(lintCastRedundantEnabled || lintCastEnabled)) { From f112f833cc2cb61858e46ec2380398a1a03c211e Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Fri, 30 May 2025 22:52:23 -0400 Subject: [PATCH 10/27] Separate instanceof into two cases --- .../common/basetype/BaseTypeChecker.java | 2 ++ .../common/basetype/BaseTypeVisitor.java | 14 +++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeChecker.java b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeChecker.java index 75ad2bef94be..bbda254484ee 100644 --- a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeChecker.java +++ b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeChecker.java @@ -216,6 +216,8 @@ protected Set createSupportedLintOptions() { lintSet.add("cast:redundant"); lintSet.add("cast:unsafe"); lintSet.add("instanceof"); + lintSet.add("instanceof:redundant"); + lintSet.add("instanceof:unsafe"); return lintSet; } diff --git a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java index 8f175a81255d..1843f04be473 100644 --- a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java +++ b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java @@ -298,9 +298,15 @@ public class BaseTypeVisitor Date: Fri, 30 May 2025 23:00:22 -0400 Subject: [PATCH 11/27] Remove unused instanceof redundant field first --- .../checkerframework/common/basetype/BaseTypeVisitor.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java index 1843f04be473..0ac39fa37a61 100644 --- a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java +++ b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java @@ -301,9 +301,6 @@ public class BaseTypeVisitor Date: Tue, 3 Jun 2025 15:51:28 -0400 Subject: [PATCH 12/27] Typo --- .../org/checkerframework/framework/source/SourceChecker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 67da603363b1..f8e4c6a00052 100644 --- a/framework/src/main/java/org/checkerframework/framework/source/SourceChecker.java +++ b/framework/src/main/java/org/checkerframework/framework/source/SourceChecker.java @@ -1890,7 +1890,7 @@ private String detailedMsgTextPositionString( // /** - * Determine which lint options are artive. + * Determine which lint options are active. * * @param options the command-line options * @return the active lint options From 75221b3288c9a24299d5adb40b7e696375f1fe16 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Tue, 3 Jun 2025 15:52:23 -0400 Subject: [PATCH 13/27] Refactor lint option --- .../common/basetype/BaseTypeVisitor.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java index 0ac39fa37a61..dca5593f0429 100644 --- a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java +++ b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java @@ -364,10 +364,12 @@ protected BaseTypeVisitor(BaseTypeChecker checker, @Nullable Factory typeFactory assumePureGetters = checker.hasOption("assumePureGetters"); checkCastElementType = checker.hasOption("checkCastElementType"); lintCastEnabled = checker.getLintOption("cast", false); - lintCastRedundantEnabled = checker.getLintOption("cast:redundant", false); - lintCastUnsafeEnabled = checker.getLintOption("cast:unsafe", true); + lintCastRedundantEnabled = + checker.getLintOption("cast:redundant", false) || lintCastEnabled; + lintCastUnsafeEnabled = checker.getLintOption("cast:unsafe", true) || lintCastEnabled; lintInstanceofEnabled = checker.getLintOption("instanceof", false); - lintInstanceofUnsafeEnabled = checker.getLintOption("instanceof:unsafe", true); + lintInstanceofUnsafeEnabled = + checker.getLintOption("instanceof:unsafe", true) || lintInstanceofEnabled; } /** An array containing just {@code BaseTypeChecker.class}. */ @@ -2737,7 +2739,7 @@ public Void visitNewArray(NewArrayTree tree, Void p) { * @param typeCastTree the TypeCastTree to check */ protected void checkTypecastRedundancy(TypeCastTree typeCastTree) { - if (!(lintCastRedundantEnabled || lintCastEnabled)) { + if (!lintCastRedundantEnabled) { return; } @@ -2751,13 +2753,13 @@ protected void checkTypecastRedundancy(TypeCastTree typeCastTree) { /** * Issues a warning if the given explicitly-written typecast is unsafe. Does nothing if the lint - * option "cast:unsafe" is not set. Only primary qualifiers are checked unless the command line + * option "-cast:unsafe" is set. Only primary qualifiers are checked unless the command line * option "checkCastElementType" is supplied. * * @param typeCastTree an explicitly-written typecast */ protected void checkTypecastSafety(TypeCastTree typeCastTree) { - if (!(lintCastUnsafeEnabled || lintCastEnabled)) { + if (!lintCastUnsafeEnabled) { return; } AnnotatedTypeMirror castType = atypeFactory.getAnnotatedType(typeCastTree); @@ -2939,7 +2941,7 @@ public Void visitTypeCast(TypeCastTree tree, Void p) { @Override public Void visitInstanceOf(InstanceOfTree tree, Void p) { - if (!(lintInstanceofEnabled || lintInstanceofUnsafeEnabled)) { + if (!lintInstanceofUnsafeEnabled) { return super.visitInstanceOf(tree, p); } // The "reference type" is the type after "instanceof". From fc6acdd465425916116c3d4bfd9ad271ddafec0b Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Tue, 3 Jun 2025 15:54:56 -0400 Subject: [PATCH 14/27] Add and rewrite text for lint option --- docs/manual/warnings.tex | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/manual/warnings.tex b/docs/manual/warnings.tex index eeec5eae94b2..6edaa1de9440 100644 --- a/docs/manual/warnings.tex +++ b/docs/manual/warnings.tex @@ -711,12 +711,11 @@ \item \code{cast:unsafe} (default: on) warn about unsafe casts that are not - checked at run time, as in \code{((@NonNull String) myref)}. Such casts - are generally not necessary because of type refinement - (Section~\ref{type-refinement}). + checked at run time, as in \code{((@NonNull String) myref)}. + Such casts are unsafe, and they can break the property of the type system. \item - \code{cast:redundant} (default: on) warn about redundant + \code{cast:redundant} (default: off) warn about redundant casts that are guaranteed to succeed at run time, as in \code{((@NonNull String) "m")}. Such casts are not necessary, because the target expression of the cast already has the given type @@ -725,6 +724,11 @@ \item \code{cast} Enable or disable all cast-related warnings. +\item + \code{instanceof:unsafe} (default: on) warn about unsafe instanceof pattern + that are not checked at run time, as in \code{o instanceof @Untainted String}. + Such instanceof patterns are unsafe, and they can break the property of the type system. + \item \code{instanceof} Enable or disable instanceof-related warnings. From e50a7d9c4541df52f1d734029d66be61d86fbdff Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Tue, 3 Jun 2025 21:41:21 -0400 Subject: [PATCH 15/27] Apply suggestions from code review Co-authored-by: Werner Dietl --- checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java | 1 + checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java | 2 ++ docs/manual/warnings.tex | 4 ++-- .../org/checkerframework/common/basetype/BaseTypeChecker.java | 1 - .../org/checkerframework/common/basetype/BaseTypeVisitor.java | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java b/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java index 99a3a9dfd023..1babe2af1330 100644 --- a/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java +++ b/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java @@ -3,6 +3,7 @@ * @summary Test case for instanceof lint option: -Alint=-instanceof * @requires jdk.version >= 17 * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=-instanceof + * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=-instanceof:unsafe */ import org.checkerframework.checker.tainting.qual.Untainted; diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java b/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java index 5af6c53e4106..5021681576a1 100644 --- a/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java +++ b/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java @@ -2,7 +2,9 @@ * @test * Test case for instanceof lint option: -Alint=instanceof * @requires jdk.version >= 17 + * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=instanceof + * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=instanceof:unsafe */ import org.checkerframework.checker.tainting.qual.Untainted; diff --git a/docs/manual/warnings.tex b/docs/manual/warnings.tex index 6edaa1de9440..b311b09f389d 100644 --- a/docs/manual/warnings.tex +++ b/docs/manual/warnings.tex @@ -725,9 +725,9 @@ \code{cast} Enable or disable all cast-related warnings. \item - \code{instanceof:unsafe} (default: on) warn about unsafe instanceof pattern + \code{instanceof:unsafe} (default: on) warn about unsafe instanceof tests that are not checked at run time, as in \code{o instanceof @Untainted String}. - Such instanceof patterns are unsafe, and they can break the property of the type system. + Such instanceof tests are unsafe as the type qualifiers are ignored at run time. \item \code{instanceof} Enable or disable instanceof-related warnings. diff --git a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeChecker.java b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeChecker.java index bbda254484ee..0bb07e6db3f8 100644 --- a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeChecker.java +++ b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeChecker.java @@ -216,7 +216,6 @@ protected Set createSupportedLintOptions() { lintSet.add("cast:redundant"); lintSet.add("cast:unsafe"); lintSet.add("instanceof"); - lintSet.add("instanceof:redundant"); lintSet.add("instanceof:unsafe"); return lintSet; } diff --git a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java index dca5593f0429..4b5f54d7f0e9 100644 --- a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java +++ b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java @@ -365,7 +365,7 @@ protected BaseTypeVisitor(BaseTypeChecker checker, @Nullable Factory typeFactory checkCastElementType = checker.hasOption("checkCastElementType"); lintCastEnabled = checker.getLintOption("cast", false); lintCastRedundantEnabled = - checker.getLintOption("cast:redundant", false) || lintCastEnabled; + lintCastEnabled || checker.getLintOption("cast:redundant", false); lintCastUnsafeEnabled = checker.getLintOption("cast:unsafe", true) || lintCastEnabled; lintInstanceofEnabled = checker.getLintOption("instanceof", false); lintInstanceofUnsafeEnabled = From 727e53236d564ffcd025abfe9db79a02aec4b8a6 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Wed, 4 Jun 2025 17:04:55 -0400 Subject: [PATCH 16/27] Logic --- .../org/checkerframework/common/basetype/BaseTypeVisitor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java index 4b5f54d7f0e9..d86767b6a995 100644 --- a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java +++ b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java @@ -366,10 +366,10 @@ protected BaseTypeVisitor(BaseTypeChecker checker, @Nullable Factory typeFactory lintCastEnabled = checker.getLintOption("cast", false); lintCastRedundantEnabled = lintCastEnabled || checker.getLintOption("cast:redundant", false); - lintCastUnsafeEnabled = checker.getLintOption("cast:unsafe", true) || lintCastEnabled; + lintCastUnsafeEnabled = lintCastEnabled || checker.getLintOption("cast:unsafe", true); lintInstanceofEnabled = checker.getLintOption("instanceof", false); lintInstanceofUnsafeEnabled = - checker.getLintOption("instanceof:unsafe", true) || lintInstanceofEnabled; + lintInstanceofEnabled || checker.getLintOption("instanceof:unsafe", true); } /** An array containing just {@code BaseTypeChecker.class}. */ From 651af78478e79bc2248d88bdd3c3b749666dc67b Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Wed, 4 Jun 2025 17:05:12 -0400 Subject: [PATCH 17/27] Format; Improve the tests --- checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java | 3 ++- checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java b/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java index 1babe2af1330..3cc46286dff5 100644 --- a/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java +++ b/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java @@ -3,7 +3,8 @@ * @summary Test case for instanceof lint option: -Alint=-instanceof * @requires jdk.version >= 17 * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=-instanceof - * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=-instanceof:unsafe + * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=-instanceof:unsafe + * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=instanceof, -instanceof::unsafe */ import org.checkerframework.checker.tainting.qual.Untainted; diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java b/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java index 5021681576a1..713baa9ecf06 100644 --- a/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java +++ b/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java @@ -5,6 +5,7 @@ * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=instanceof * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=instanceof:unsafe + * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=-instanceof, instanceof::unsafe */ import org.checkerframework.checker.tainting.qual.Untainted; From 4bbb1b3bf59b63198d4cbfa9b4d4e5e655c22fd0 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Wed, 4 Jun 2025 20:45:19 -0400 Subject: [PATCH 18/27] Reword --- docs/manual/warnings.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/manual/warnings.tex b/docs/manual/warnings.tex index b311b09f389d..bf4a2e6afb53 100644 --- a/docs/manual/warnings.tex +++ b/docs/manual/warnings.tex @@ -712,7 +712,7 @@ \item \code{cast:unsafe} (default: on) warn about unsafe casts that are not checked at run time, as in \code{((@NonNull String) myref)}. - Such casts are unsafe, and they can break the property of the type system. + Such casts are unsafe as the type qualifiers are ignored at run time. \item \code{cast:redundant} (default: off) warn about redundant From 6e44d24e15b34422898cf822382cc86cbbe1b367 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Wed, 4 Jun 2025 20:49:04 -0400 Subject: [PATCH 19/27] Fix test case format --- checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java | 2 +- checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java b/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java index 3cc46286dff5..fd1f1cb5686e 100644 --- a/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java +++ b/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java @@ -4,7 +4,7 @@ * @requires jdk.version >= 17 * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=-instanceof * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=-instanceof:unsafe - * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=instanceof, -instanceof::unsafe + * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=instanceof,-instanceof::unsafe */ import org.checkerframework.checker.tainting.qual.Untainted; diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java b/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java index 713baa9ecf06..37bb0d787df6 100644 --- a/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java +++ b/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java @@ -5,7 +5,7 @@ * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=instanceof * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=instanceof:unsafe - * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=-instanceof, instanceof::unsafe + * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=-instanceof,instanceof::unsafe */ import org.checkerframework.checker.tainting.qual.Untainted; From 531531ba6c5aa92701f05bbd7344ba6e9fd9c240 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Wed, 4 Jun 2025 20:49:17 -0400 Subject: [PATCH 20/27] Try new logic --- .../common/basetype/BaseTypeVisitor.java | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java index d86767b6a995..ba14a0c6599e 100644 --- a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java +++ b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java @@ -289,18 +289,12 @@ public class BaseTypeVisitor Date: Wed, 4 Jun 2025 20:52:34 -0400 Subject: [PATCH 21/27] Small fix --- .../org/checkerframework/common/basetype/BaseTypeVisitor.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java index ba14a0c6599e..582ceed3e4d7 100644 --- a/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java +++ b/framework/src/main/java/org/checkerframework/common/basetype/BaseTypeVisitor.java @@ -357,10 +357,8 @@ protected BaseTypeVisitor(BaseTypeChecker checker, @Nullable Factory typeFactory checker.hasOption("assumeDeterministic") || checker.hasOption("assumePure"); assumePureGetters = checker.hasOption("assumePureGetters"); checkCastElementType = checker.hasOption("checkCastElementType"); - lintCastEnabled = checker.getLintOption("cast", false); lintCastRedundantEnabled = checker.getLintOption("cast:redundant", false); lintCastUnsafeEnabled = checker.getLintOption("cast:unsafe", true); - lintInstanceofEnabled = checker.getLintOption("instanceof", false); lintInstanceofUnsafeEnabled = checker.getLintOption("instanceof:unsafe", true); } From 52b175e7633d143cafc2efccf099a5b767fc1488 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Wed, 4 Jun 2025 21:07:33 -0400 Subject: [PATCH 22/27] Fix line number in output --- checker/jtreg/Lintoption/InstanceofLintOptionEnabled.out | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.out b/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.out index e4c0ce511a0b..022fdc865176 100644 --- a/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.out +++ b/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.out @@ -1,4 +1,4 @@ -InstanceofLintOptionEnabled.java:12:15: compiler.warn.proc.messager: [instanceof.pattern.unsafe] instanceof pattern binding '@Tainted Object' to '@Untainted +InstanceofLintOptionEnabled.java:15:15: compiler.warn.proc.messager: [instanceof.pattern.unsafe] instanceof pattern binding '@Tainted Object' to '@Untainted String s' cannot be statically verified. -InstanceofLintOptionEnabled.java:13:15: compiler.warn.proc.messager: [instanceof.unsafe] '@Tainted Object' instanceof '@Untainted String' cannot be statically verified. +InstanceofLintOptionEnabled.java:16:15: compiler.warn.proc.messager: [instanceof.unsafe] '@Tainted Object' instanceof '@Untainted String' cannot be statically verified. 2 warnings From b1a2a8dd66c069b2fa9e44e8c5b19559771aafe9 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Wed, 4 Jun 2025 21:07:52 -0400 Subject: [PATCH 23/27] Use correct strings --- checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java | 2 +- checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java b/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java index fd1f1cb5686e..424f98c79b68 100644 --- a/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java +++ b/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java @@ -4,7 +4,7 @@ * @requires jdk.version >= 17 * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=-instanceof * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=-instanceof:unsafe - * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=instanceof,-instanceof::unsafe + * @compile -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=instanceof,-instanceof:unsafe */ import org.checkerframework.checker.tainting.qual.Untainted; diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java b/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java index 37bb0d787df6..5db7250ef722 100644 --- a/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java +++ b/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java @@ -5,7 +5,7 @@ * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=instanceof * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=instanceof:unsafe - * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=-instanceof,instanceof::unsafe + * @compile/ref=InstanceofLintOptionEnabled.out -XDrawDiagnostics -processor org.checkerframework.checker.tainting.TaintingChecker InstanceofLintOptionEnabled.java -Alint=-instanceof,instanceof:unsafe */ import org.checkerframework.checker.tainting.qual.Untainted; From a6d21653db98ef62112ab7a7ab2179e326cdacc0 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Wed, 4 Jun 2025 21:08:39 -0400 Subject: [PATCH 24/27] Use lowercase for folder name --- .../{Lintoption => lintoption}/InstanceofLintOptionDisabled.java | 0 .../{Lintoption => lintoption}/InstanceofLintOptionEnabled.java | 0 .../{Lintoption => lintoption}/InstanceofLintOptionEnabled.out | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename checker/jtreg/{Lintoption => lintoption}/InstanceofLintOptionDisabled.java (100%) rename checker/jtreg/{Lintoption => lintoption}/InstanceofLintOptionEnabled.java (100%) rename checker/jtreg/{Lintoption => lintoption}/InstanceofLintOptionEnabled.out (100%) diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java b/checker/jtreg/lintoption/InstanceofLintOptionDisabled.java similarity index 100% rename from checker/jtreg/Lintoption/InstanceofLintOptionDisabled.java rename to checker/jtreg/lintoption/InstanceofLintOptionDisabled.java diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java b/checker/jtreg/lintoption/InstanceofLintOptionEnabled.java similarity index 100% rename from checker/jtreg/Lintoption/InstanceofLintOptionEnabled.java rename to checker/jtreg/lintoption/InstanceofLintOptionEnabled.java diff --git a/checker/jtreg/Lintoption/InstanceofLintOptionEnabled.out b/checker/jtreg/lintoption/InstanceofLintOptionEnabled.out similarity index 100% rename from checker/jtreg/Lintoption/InstanceofLintOptionEnabled.out rename to checker/jtreg/lintoption/InstanceofLintOptionEnabled.out From c16a0faf69040f9493e02833d115cc4cc61d47a7 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Fri, 6 Jun 2025 17:47:30 -0400 Subject: [PATCH 25/27] Changelog --- docs/CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index b1fbb31db0a7..079411e35e64 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -3,6 +3,9 @@ Version 3.49.3-eisop2 (June ??, 2025) **User-visible changes:** +`instanceof.unsafe` and `instanceof.pattern.unsafe` warnings in the Checker Framework are now controlled by lint options. +They are enabled by default and can be disabled using -Alint=-instanceof.unsafe or -Alint=-instanceof. + **Implementation details:** **Closed issues:** From c35d301d964a1b7dd9c9891c76157ddc8cc5fdf4 Mon Sep 17 00:00:00 2001 From: Aosen Xiong Date: Fri, 6 Jun 2025 18:21:15 -0400 Subject: [PATCH 26/27] Empty commit for CI From ff83cb75dce666cfd9956da57050dd83ee288854 Mon Sep 17 00:00:00 2001 From: Werner Dietl Date: Sun, 15 Jun 2025 13:09:13 -0400 Subject: [PATCH 27/27] Tweak text --- docs/CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 079411e35e64..0c484113ac6d 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -3,8 +3,8 @@ Version 3.49.3-eisop2 (June ??, 2025) **User-visible changes:** -`instanceof.unsafe` and `instanceof.pattern.unsafe` warnings in the Checker Framework are now controlled by lint options. -They are enabled by default and can be disabled using -Alint=-instanceof.unsafe or -Alint=-instanceof. +The `instanceof.unsafe` and `instanceof.pattern.unsafe` warnings in the Checker Framework are now controlled by lint options. +They are enabled by default and can be disabled using `-Alint=-instanceof.unsafe` or `-Alint=-instanceof`. **Implementation details:**