typetools / typetools/checker-framework

Refined types in loops should not be cached

Open
#602 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug False Negative (missing warning or unsoundness) nondeterminism
Dominant language
Java
Stars
1.1k
Forks
440
Avg merge
1d 12h
Merged PRs (30d)
134

Description

Because the qualified types of some expressions are cached, the code below does not issue a warning that it should.

class Loop {
    @PolyNull String id(@PolyNull String o) {
        return o;
    }
    void loop(boolean condition) {
        @NonNull String notNull = "hello";
        String nullable = "";
        while (condition) {
            notNull = nullable;  // error, the type of nullable is not cached.
            notNull = id(nullable); // no error, the type of id(nullable) is cached.
            nullable = null;
        }
    }
}

When data flow analyzes the code in the loop for the first time, the type of nullable is @NonNull, so the type of id(nullable) is also @NonNull. This type is cached in the AnnotatedTypeFactory and then used on subsequent data flow passes and also when type checking.

Caching should be turned off when data flow is analyzing code in a loop.

Contributor guide

Open the contributing guide

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.

Research direction

Start by tracing how the AnnotatedTypeFactory caches qualified expression types during data-flow analysis, using the Loop example in the issue to reproduce the missing warning. Check the behavior across repeated passes through the loop and during type checking. Done means caching is disabled while analyzing loop data flow and the assignment through id(nullable) reports the expected error.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.