Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Crash in CFG construction when unboxing an Integer-bounded type variable

Open
#8,328 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

@msridhar is already working on this.

Since Oct 8, 2026.

  • #8329 by @msridhar — open

Assessment

Difficulty
3/5
Estimated time
1-2 days
Newbie friendliness
20/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Stale
Tech stack
java
Domain
testing-qa

Research direction

Start in dataflow/src/main/java/org/checkerframework/dataflow/cfg/builder/CFGTranslationPhaseOne.java, at binaryPromotedType around lines 1021–1040, and compare ordinary type-variable handling with the captured-variable case. Reproduce with the Java input in the issue and add a regression test for arithmetic on an Integer-bounded type variable; done means CFG construction no longer crashes. A linked pull request (#8329) is already open.

Written by the indexing model from the issue text.

Description

The Nullness Checker crashes when building the CFG for arithmetic that unboxes an ordinary type variable bounded by Integer. This was originally reported in uber/NullAway#1933, and reproduces directly in Checker Framework without NullAway.

Environment
  • Checker Framework 4.3.1-SNAPSHOT, built from master at 0091b160928cda73f8c3dff4cd871fada0a7518e.
  • JDK:
openjdk version "25.0.4.1" 2026-08-18 LTS
OpenJDK Runtime Environment Temurin-25.0.4.1+1 (build 25.0.4.1+1-LTS)
OpenJDK 64-Bit Server VM Temurin-25.0.4.1+1 (build 25.0.4.1+1-LTS, mixed mode, sharing)
Input
class Test<T extends Integer> {
    int test(T t) {
        return t + 1;
    }
}
Actual output

When run with the Nullness Checker:

Full compiler output
error: SourceChecker.typeProcess: unexpected Throwable (IllegalArgumentException) while processing Test.java; message: T
  ; The Checker Framework crashed.  Please report the crash.  Version: Checker Framework 4.3.1-SNAPSHOT, branch master, 2026-10-04, commit 0091b16, dirty=true. 
  Compilation unit: Test.java
  Last visited tree at line 1 column 1:
  class Test<T extends Integer> {
  Exception: java.lang.IllegalArgumentException: T; java.lang.IllegalArgumentException: T
  	at jdk.compiler/com.sun.tools.javac.model.JavacTypes.unboxedType(JavacTypes.java:148)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.binaryPromotedType(CFGTranslationPhaseOne.java:1027)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.visitBinary(CFGTranslationPhaseOne.java:3947)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.visitBinary(CFGTranslationPhaseOne.java:211)
  	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBinary.accept(JCTree.java:2230)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.scan(CFGTranslationPhaseOne.java:579)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.visitReturn(CFGTranslationPhaseOne.java:3065)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.visitReturn(CFGTranslationPhaseOne.java:211)
  	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCReturn.accept(JCTree.java:1780)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.scan(CFGTranslationPhaseOne.java:579)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.visitBlock(CFGTranslationPhaseOne.java:1537)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.visitBlock(CFGTranslationPhaseOne.java:211)
  	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1148)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.scan(CFGTranslationPhaseOne.java:579)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.process(CFGTranslationPhaseOne.java:478)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.process(CFGTranslationPhaseOne.java:530)
  	at org.checkerframework.framework.flow.CFCFGBuilder.build(CFCFGBuilder.java:71)
  	at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.analyze(GenericAnnotatedTypeFactory.java:1631)
  	at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.performFlowAnalysisForMethod(GenericAnnotatedTypeFactory.java:1514)
  	at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.performFlowAnalysisForClass(GenericAnnotatedTypeFactory.java:1443)
  	at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.performFlowAnalysisForClassOnce(GenericAnnotatedTypeFactory.java:2053)
  	at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.preProcessClassTree(GenericAnnotatedTypeFactory.java:431)
  	at org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:591)
  	at org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:197)
  	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:899)
  	at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:66)
  	at org.checkerframework.framework.source.SourceVisitor.visit(SourceVisitor.java:88)
  	at org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:1395)
  	at org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:1316)
  	at org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:196)
  	at jdk.compiler/com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:876)
  	at jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:133)
  	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1423)
  	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1380)
  	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:968)
  	at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:319)
  	at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:178)
  	at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:66)
  	at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:52)
error: SourceChecker.typeProcess: unexpected Throwable (IllegalArgumentException) while processing Test.java; message: T
  ; The Checker Framework crashed.  Please report the crash.  Version: Checker Framework 4.3.1-SNAPSHOT, branch master, 2026-10-04, commit 0091b16, dirty=true. 
  Compilation unit: Test.java
  Last visited tree at line 1 column 1:
  class Test<T extends Integer> {
  Exception: java.lang.IllegalArgumentException: T; java.lang.IllegalArgumentException: T
  	at jdk.compiler/com.sun.tools.javac.model.JavacTypes.unboxedType(JavacTypes.java:148)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.binaryPromotedType(CFGTranslationPhaseOne.java:1027)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.visitBinary(CFGTranslationPhaseOne.java:3947)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.visitBinary(CFGTranslationPhaseOne.java:211)
  	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBinary.accept(JCTree.java:2230)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.scan(CFGTranslationPhaseOne.java:579)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.visitReturn(CFGTranslationPhaseOne.java:3065)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.visitReturn(CFGTranslationPhaseOne.java:211)
  	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCReturn.accept(JCTree.java:1780)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.scan(CFGTranslationPhaseOne.java:579)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.visitBlock(CFGTranslationPhaseOne.java:1537)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.visitBlock(CFGTranslationPhaseOne.java:211)
  	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBlock.accept(JCTree.java:1148)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.scan(CFGTranslationPhaseOne.java:579)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.process(CFGTranslationPhaseOne.java:478)
  	at org.checkerframework.dataflow.cfg.builder.CFGTranslationPhaseOne.process(CFGTranslationPhaseOne.java:530)
  	at org.checkerframework.framework.flow.CFCFGBuilder.build(CFCFGBuilder.java:71)
  	at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.analyze(GenericAnnotatedTypeFactory.java:1631)
  	at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.performFlowAnalysisForMethod(GenericAnnotatedTypeFactory.java:1514)
  	at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.performFlowAnalysisForClass(GenericAnnotatedTypeFactory.java:1443)
  	at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.performFlowAnalysisForClassOnce(GenericAnnotatedTypeFactory.java:2053)
  	at org.checkerframework.framework.type.GenericAnnotatedTypeFactory.preProcessClassTree(GenericAnnotatedTypeFactory.java:431)
  	at org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:591)
  	at org.checkerframework.common.basetype.BaseTypeVisitor.visitClass(BaseTypeVisitor.java:197)
  	at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:899)
  	at jdk.compiler/com.sun.source.util.TreePathScanner.scan(TreePathScanner.java:66)
  	at org.checkerframework.framework.source.SourceVisitor.visit(SourceVisitor.java:88)
  	at org.checkerframework.framework.source.SourceChecker.typeProcess(SourceChecker.java:1395)
  	at org.checkerframework.javacutil.AbstractTypeProcessor$AttributionTaskListener.finished(AbstractTypeProcessor.java:196)
  	at jdk.compiler/com.sun.tools.javac.api.ClientCodeWrapper$WrappedTaskListener.finished(ClientCodeWrapper.java:876)
  	at jdk.compiler/com.sun.tools.javac.api.MultiTaskListener.finished(MultiTaskListener.java:133)
  	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1423)
  	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.flow(JavaCompiler.java:1380)
  	at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:968)
  	at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:319)
  	at jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:178)
  	at jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:66)
  	at jdk.compiler/com.sun.tools.javac.Main.main(Main.java:52)
2 errors
Investigation

CFGTranslationPhaseOne.binaryPromotedType resolves the upper bound for captured type variables, but passes ordinary type variables directly to Types.unboxedType. Javac's implementation rejects T with IllegalArgumentException, even though its bound is a wrapper class.

Related: #6811 covered a crash involving captured wildcards; this reproducer has no wildcards.

Dominant language
Java
Stars
1.1k
Forks
440
Avg merge
1d 8h
Merged PRs (30d)
149

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from typetools/checker-framework

All issues in typetools/checker-framework

Similar issues

More Java issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.