uber/NullAway

Document sources of deliberate unsoundness

Chiusa

#1617 aperta il 20 giu 2026

 (5 commenti) (0 reazioni) (1 assegnatario)Java (288 fork)batch import
documentationgood first issue

Metriche repository

Star
 (3462 stelle)
Metriche merge PR
 (Merge medio 3g 23h) (14 PR mergiate in 30 g)

Descrizione

Description

NullAway currently does not warn when doing nested null-checks with mutable data. I can write:

if(rental.returnPolicy() == null || rental.returnPolicy().mustBeReturnedAfter() == null){
    //                                                                                   ^^^^^
    // is not, but should be: [NullAway] dereferenced expression rental.returnPolicy() is @Nullable
    // returnPolicy is just a method so its return value could change between first and second call
    return 0;
}

To me that seems like a false negative. It does not warn but should.

Minimal repro

import org.jetbrains.annotations.Nullable;

public class Main {
    public static void main(String[] args){
        check(new RegularRental());
    }

    static int check(Rental rental){
        if(rental.returnPolicy() == null || rental.returnPolicy().mustBeReturnedAfter() == null){
            //                                                    ^^^^^^^^^^^^^^^^^^^^
            // is not, but should be: [NullAway] dereferenced expression rental.returnPolicy() is @Nullable
            // returnPolicy is just a method so its return value could change between first and second call
            return 0;
        }
        return 1;
    }
}


interface Rental {
    @Nullable ReturnPolicy returnPolicy();
}

class RegularRental implements Rental {

    private ReturnPolicy returnPolicy = new ReturnPolicy("2");

    @Override public ReturnPolicy returnPolicy(){ return this.returnPolicy; }
}

class ReturnPolicy {
    private @Nullable String mustBeReturnedAfter;

    ReturnPolicy(@Nullable String mustBeReturnedAfter) { this.mustBeReturnedAfter = mustBeReturnedAfter; }

    public @Nullable String mustBeReturnedAfter() { return mustBeReturnedAfter; }
}

Guida contributor