Fix inconsistent treatment of generated code with restrictive annotations #618
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Without this change, we have a bug whenever the following flags are
used together:
and a method inside
@Generated
code is explicitly marked as having a@Nullable
return.In this case, the
RestrictiveAnnotationHandler
would treat the methodas definitely
@NonNull
when handling theonOverrideMayBeNullExpr
extensionpoint, but as
@Nullable
for the purposes ofonDataflowVisitMethodInvocation
.This is inconsistent on its own, but it produces even more undesirable behavior
if a
castToNonNull
method is configured (whether through library models or-XepOpt:NullAway:CastToNonNullMethod
).If
foo
is such a@Generated
+@Nullable
method, then, in the aboveconfiguration:
Produces an error, claiming that a known
@NonNull
value is being passed tothe cast.
Yet the following code:
Causes NullAway to complain about a
@Nullable
dereference (due to dataflowconcluding
o
is@Nullable
).To fix this, we need to make sure that the behavior of
AcknowledgeRestrictiveAnnotations
is consistent.
One option is to not care about
@Generated
vs non-generated code, orabout
TreatGeneratedAsUnannotated
, and always use restrictive annotationsif available. Unfortunatelly, this is a change that will increase the number of
errors from NullAway on existing codebases (internally, we use
TreatGeneratedAsUnannotated
explicitly as a way to relax our checks aroundthrift generated code which does have
@Nullable
annotations). Thus, the oneremaining answer seems to be that, in this configuration, generated code should
be treated optimistically for both
onOverrideMayBeNullExpr
and dataflow.