Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initialization problem in while true loop #1727

Closed
topnessman opened this issue Dec 29, 2017 · 3 comments · Fixed by #3389
Closed

Initialization problem in while true loop #1727

topnessman opened this issue Dec 29, 2017 · 3 comments · Fixed by #3389

Comments

@topnessman
Copy link
Contributor

Testcase(please remove txt file extension after download):

Bug.java.txt

class B {

}

public class Bug {

    private B foo() {
        // Default type for local variable b is @UnknownInitialization @Nullable
        B b;

        while (true) {
            B op = getB();
            if (op == null) {
                b = new B();
                break;
            } else {
                b = op;
                break;
            }
        }

        return b;
    }

     private B getB() {return new B();}
}

Command I used:
javac -processor nullness testinput/typecheck/Bug.java -version -verbose -AprintErrorStack -AprintAllQualifiers

Console Output:

javac 1.8.0-jsr308-2.2.2
[parsing started RegularFileObject[testinput/typecheck/Bug.java]]
[parsing completed 17ms]
[search path for source files: /home/mier/jsr308/checker-framework/checker/bin-devel/../../dataflow/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../javacutil/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../stubparser/stubparser.jar,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../annotation-tools/scene-lib/bin,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../annotation-tools/annotation-file-utilities/annotation-file-utilities.jar,/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/checker-qual.jar,.,./bin,./build,/home/mier/Downloads/weka-3-8-1/mysql-connector-java-5.0.8/mysql-connector-java-5.0.8-bin.jar]
[search path for class files: /home/mier/jsr308/checker-framework/checker/bin-devel/../jdk/annotated,/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar,/home/mier/jdk1.8.0_73/jre/lib/resources.jar,/home/mier/jdk1.8.0_73/jre/lib/rt.jar,/home/mier/jdk1.8.0_73/jre/lib/sunrsasign.jar,/home/mier/jdk1.8.0_73/jre/lib/jsse.jar,/home/mier/jdk1.8.0_73/jre/lib/jce.jar,/home/mier/jdk1.8.0_73/jre/lib/charsets.jar,/home/mier/jdk1.8.0_73/jre/lib/jfr.jar,/home/mier/jdk1.8.0_73/jre/classes,/home/mier/jdk1.8.0_73/jre/lib/ext/sunpkcs11.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/sunjce_provider.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/localedata.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/zipfs.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/cldrdata.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/dnsns.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/sunec.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/jfxrt.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/nashorn.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/jaccess.jar,/home/mier/jsr308/checker-framework/checker/bin-devel/../../dataflow/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../javacutil/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../stubparser/stubparser.jar,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../annotation-tools/scene-lib/bin,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../annotation-tools/annotation-file-utilities/annotation-file-utilities.jar,/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/checker-qual.jar,.,./bin,./build,/home/mier/Downloads/weka-3-8-1/mysql-connector-java-5.0.8/mysql-connector-java-5.0.8-bin.jar]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/Object.class)]]
Round 1:
	input files: {B, Bug}
	annotations: []
	last round: false
Processor org.checkerframework.checker.nullness.NullnessChecker matches [] and returns false.
[search path for source files: /home/mier/jsr308/checker-framework/checker/bin-devel/../../dataflow/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../javacutil/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../stubparser/stubparser.jar,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../annotation-tools/scene-lib/bin,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../annotation-tools/annotation-file-utilities/annotation-file-utilities.jar,/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/checker-qual.jar,.,./bin,./build,/home/mier/Downloads/weka-3-8-1/mysql-connector-java-5.0.8/mysql-connector-java-5.0.8-bin.jar]
[search path for class files: /home/mier/jsr308/checker-framework/checker/bin-devel/../jdk/annotated,/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar,/home/mier/jdk1.8.0_73/jre/lib/resources.jar,/home/mier/jdk1.8.0_73/jre/lib/rt.jar,/home/mier/jdk1.8.0_73/jre/lib/sunrsasign.jar,/home/mier/jdk1.8.0_73/jre/lib/jsse.jar,/home/mier/jdk1.8.0_73/jre/lib/jce.jar,/home/mier/jdk1.8.0_73/jre/lib/charsets.jar,/home/mier/jdk1.8.0_73/jre/lib/jfr.jar,/home/mier/jdk1.8.0_73/jre/classes,/home/mier/jdk1.8.0_73/jre/lib/ext/sunpkcs11.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/sunjce_provider.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/localedata.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/zipfs.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/cldrdata.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/dnsns.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/sunec.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/jfxrt.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/nashorn.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/jaccess.jar,/home/mier/jsr308/checker-framework/checker/bin-devel/../../dataflow/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../javacutil/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../stubparser/stubparser.jar,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../annotation-tools/scene-lib/bin,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../annotation-tools/annotation-file-utilities/annotation-file-utilities.jar,/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/checker-qual.jar,.,./bin,./build,/home/mier/Downloads/weka-3-8-1/mysql-connector-java-5.0.8/mysql-connector-java-5.0.8-bin.jar]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/Object.class)]]
Round 2:
	input files: {}
	annotations: []
	last round: true
[search path for source files: /home/mier/jsr308/checker-framework/checker/bin-devel/../../dataflow/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../javacutil/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../stubparser/stubparser.jar,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../annotation-tools/scene-lib/bin,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../annotation-tools/annotation-file-utilities/annotation-file-utilities.jar,/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/checker-qual.jar,.,./bin,./build,/home/mier/Downloads/weka-3-8-1/mysql-connector-java-5.0.8/mysql-connector-java-5.0.8-bin.jar]
[search path for class files: /home/mier/jsr308/checker-framework/checker/bin-devel/../jdk/annotated,/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar,/home/mier/jdk1.8.0_73/jre/lib/resources.jar,/home/mier/jdk1.8.0_73/jre/lib/rt.jar,/home/mier/jdk1.8.0_73/jre/lib/sunrsasign.jar,/home/mier/jdk1.8.0_73/jre/lib/jsse.jar,/home/mier/jdk1.8.0_73/jre/lib/jce.jar,/home/mier/jdk1.8.0_73/jre/lib/charsets.jar,/home/mier/jdk1.8.0_73/jre/lib/jfr.jar,/home/mier/jdk1.8.0_73/jre/classes,/home/mier/jdk1.8.0_73/jre/lib/ext/sunpkcs11.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/sunjce_provider.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/localedata.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/zipfs.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/cldrdata.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/dnsns.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/sunec.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/jfxrt.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/nashorn.jar,/home/mier/jdk1.8.0_73/jre/lib/ext/jaccess.jar,/home/mier/jsr308/checker-framework/checker/bin-devel/../../dataflow/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../javacutil/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../stubparser/stubparser.jar,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../annotation-tools/scene-lib/bin,/home/mier/jsr308/checker-framework/checker/bin-devel/../../../annotation-tools/annotation-file-utilities/annotation-file-utilities.jar,/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/checker-qual.jar,.,./bin,./build,/home/mier/Downloads/weka-3-8-1/mysql-connector-java-5.0.8/mysql-connector-java-5.0.8-bin.jar]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/Object.class)]]
[checking B]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/io/Serializable.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/AutoCloseable.class)]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/framework/qual/FromByteCode.class]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/java/lang/annotation/Retention.class)]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/java/lang/annotation/RetentionPolicy.class)]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/java/lang/annotation/Target.class)]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/java/lang/annotation/ElementType.class)]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/framework/qual/SubtypeOf.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/framework/qual/FromStubFile.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/nullness/qual/KeyFor.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/nullness/qual/UnknownKeyFor.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/nullness/qual/KeyForBottom.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/framework/qual/TargetLocations.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/framework/qual/TypeUseLocation.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/framework/qual/DefaultFor.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/framework/qual/ImplicitFor.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/framework/qual/LiteralKind.class]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/Map.class)]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/framework/qual/PolyAll.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/framework/qual/PolymorphicQualifier.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/nullness/qual/PolyKeyFor.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../dataflow/build/org/checkerframework/dataflow/qual/Pure.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../dataflow/build/org/checkerframework/dataflow/qual/SideEffectFree.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../dataflow/build/org/checkerframework/dataflow/qual/Deterministic.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../dataflow/build/org/checkerframework/dataflow/qual/TerminatesExecution.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/framework/qual/Unqualified.class]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/Map$Entry.class)]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/framework/qual/Covariant.class]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/Class.class)]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/nullness/qual/EnsuresNonNullIf.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/framework/qual/ConditionalPostconditionAnnotation.class]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Class$AnnotationData.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/Class$MethodArray.class)]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Class$ReflectionData.class)]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Class$Atomic.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/Class$EnclosingMethodInfo.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/reflect/AnnotatedElement.class)]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/java/lang/reflect/Type.class)]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/java/lang/reflect/GenericDeclaration.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/String.class)]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/index/qual/LTLengthOf.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/index/qual/LTEqLengthOf.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/index/qual/IndexFor.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/index/qual/IndexOrHigh.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/index/qual/LengthOf.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/index/qual/IndexOrLow.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/common/value/qual/ArrayLenRange.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/common/value/qual/MinLen.class]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/reflect/Method.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/SuppressWarnings.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/NoSuchMethodException.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/SecurityException.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/reflect/Constructor.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/Character.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/Character$CharacterCache.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/Character$UnicodeScript.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/Character$UnicodeBlock.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/Character$Subset.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/Comparable.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/CharSequence.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/Enum.class)]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/initialization/qual/UnknownInitialization.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/nullness/qual/Raw.class]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/String$CaseInsensitiveComparator.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/System.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/UnsupportedOperationException.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/Throwable.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/TimeZone.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/lang/Cloneable.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/logging/Logger.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/logging/Logger$SystemLoggerHelper.class)]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/java/util/logging/Logger$LoggerBundle.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/ResourceBundle.class)]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/java/util/logging/Filter.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/logging/LogRecord.class)]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/java/util/logging/Level.class)]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/java/util/logging/Handler.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$CharPropertyNames.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$BnMS.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$BnM.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Bound.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$NotBehindS.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$NotBehind.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$BehindS.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Behind.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Neg.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Pos.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Conditional.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$First.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$CIBackRef.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$BackRef.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$LazyLoop.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Loop.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Prolog.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$GroupTail.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$GroupRef.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$GroupHead.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Branch.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$BranchConn.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$GroupCurly.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Curly.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Ques.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$UnixDot.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Dot.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$All.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$SliceUS.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$SliceIS.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$SliceS.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$SliceU.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$SliceI.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Slice.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$SliceNode.class)]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/java/util/regex/Pattern$HorizWS.class)]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/java/util/regex/Pattern$VertWS.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Ctype.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Utype.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Category.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Script.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Block.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$SingleU.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$SingleI.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Single.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$SingleS.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$BmpCharProperty.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$CharProperty.class)]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/java/util/regex/Pattern$LineEnding.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$UnixDollar.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Dollar.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$LastMatch.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$UnixCaret.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Caret.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$End.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Begin.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$StartS.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Start.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$LastNode.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$Node.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$BitClass.class)]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/regex/Pattern$TreeInfo.class)]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/initialization/qual/Initialized.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/initialization/qual/UnderInitialization.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/initialization/qual/NotOnlyInitialized.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/initialization/qual/FBCBottom.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/nullness/qual/NonNull.class]]
[loading ZipFileIndexFileObject[/home/mier/jdk1.8.0_73/lib/ct.sym(META-INF/sym/rt.jar/javax/lang/model/type/TypeKind.class)]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/framework/qual/DefaultInUncheckedCodeFor.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/nullness/qual/Nullable.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/nullness/qual/PolyNull.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/nullness/qual/MonotonicNonNull.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../framework/build/org/checkerframework/framework/qual/MonotonicQualifier.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/nullness/qual/NonRaw.class]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../checker/build/org/checkerframework/checker/nullness/qual/PolyRaw.class]]
[loading ZipFileIndexFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../dist/jdk8.jar(java/util/Collection.class)]]
[loading RegularFileObject[/home/mier/jsr308/checker-framework/checker/bin-devel/../../dataflow/build/org/checkerframework/dataflow/qual/Pure$Kind.class]]
[wrote RegularFileObject[testinput/typecheck/B.class]]
[checking Bug]
testinput/typecheck/Bug.java:22: error: [return.type.incompatible] incompatible types in return.
        return b;
               ^
  found   : @UnknownInitialization @Nullable B
  required: @Initialized @NonNull B
[total 1149ms]
1 error

Expected: no errors
Actual: return type incompatible on line 22.

Reasoning: while(true) loop is guaranteed to be executed and both branches(if&else) initializes b to be a @NonNull value. So at line 22, b's type should be @Initialized @NonNull.

@topnessman
Copy link
Contributor Author

topnessman commented Dec 29, 2017

javac compiler has special handling for while(true) loop: javac assumes that the loop body is executed at least once.
For example, if I change my testcase to this:

class B {

}

public class Bug {

    private B foo(int x, int y) {
        B b;

        while (x==y) {// This line is not always true
            B op = getB();
            if (op == null) {
                b = new B();
                break;
            }else{
                b = op;
                break;
            }
        }

        return b;
    }

     private B getB() {return new B();}
}

And after I ran: javac -processor nullness testinput/typecheck/Bug.java, console output is:

testinput/typecheck/Bug.java:22: error: variable b might not have been initialized
        return b;
               ^
1 error

This makes sense, because if x is not equal to y, b is not guaranteed to be initialized, so Java's type system conservatively warns variable b might not have been initialized.

But if we change x==y back to while(true) again, Java's compiler saw that b will definitely be initialized and so there wasn't variable b might not have been initialized error and NullnessChecker got the opportunity to furthur analyze the source code and issued the return.type.incompatible error at line 22 as indicated above. For me, dataflow isn't doing the right thing - it lacks the special handling like Java for while(true) loop.

@cpovirk
Copy link
Contributor

cpovirk commented Dec 27, 2019

Thanks for filing this :) I just encountered the same thing, and once I minimized it, I was able to find this existing issue. Here's what I ended up with:

$ cat AssignAndBreak.java
class AssignAndBreak {
  void foo() {
    Object e;
    while (true) {
      e = "";
      break;
    }
    e.toString();
  }
}
$ checker/bin/javac -d out -processor org.checkerframework.checker.nullness.NullnessChecker AssignAndBreak.java )
AssignAndBreak.java:8: error: [dereference.of.nullable] dereference of possibly-null reference e
    e.toString();
    ^
1 error

FYI, we saw it in our Queues class.

@cpovirk
Copy link
Contributor

cpovirk commented Dec 27, 2019

Sorry, I forgot to add: I had hoped that switching to do-while might work around this, but it appears that it does not.

smillst pushed a commit that referenced this issue Jun 30, 2020
This PR fixes both issue #3249 and issue #1727, by adapting the CFG in the following way:

If the loop condition is checked to be a constant true  (according to the same logic in javac flow analysis), then the loop condition does not have an else-branch, i.e. the block holding the loop condition is directly followed by the one holding the loop entry, instead of followed by a conditional block.

Fixes #1727 and Fixes #3249`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants