uber / NullAway

A tool to help eliminate NullPointerExceptions (NPEs) in your Java code with low build-time overhead
MIT License
3.63k stars 293 forks source link

Update handling of varargs in unannotated / unmarked code #1027

Open msridhar opened 1 month ago

msridhar commented 1 month ago

Follow-up to #1025. If the varargs argument is in unannotated code and restrictive annotations are disabled, callers from marked code should be able to pass @Nullable either for individual varargs arguments or a @Nullable varargs array.

With restrictive annotations enabled, hopefully this table should cover the behaviors when we see explicit @NonNull annotations (legacy mode behavior to be confirmed):

Annotation Type Annotation Position Mode @NonNull varargs array @NonNull individual args
declaration - standard
declaration - legacy
declaration - JSpecify
type use before ... standard
type use before ... legacy
type use before ... JSpecify
type use elements standard
type use elements legacy
type use elements JSpecify
type use both standard
type use both legacy
type use both JSpecify
both before ... standard
both before ... legacy
both before ... JSpecify
both elements standard
both elements legacy
both elements JSpecify
both both standard
both both legacy
both both JSpecify

Note that restrictive annotations are read from @NullUnmarked code by default, so calls into @NullUnmarked code should behave as per the table even if the restrictive annotations flag is not passed.