[Checkers] Suggestions for NonNull checker warning messages

Michael Ernst mernst at csail.mit.edu
Mon Apr 21 14:15:34 EDT 2008


Matt-

1. I'm having trouble interpreting this error message.

./daikon/inv/unary/sequence/NoDuplicates.java:71: call to isLoggable(java.util.logging.Level) not allowed on the given receiver.
found   : @Nullable Logger
required: @NonNull Logger
    if (debug.isLoggable(Level.FINE)) {
                        ^

Does it just mean that the receiver might be null?  In that case, I think
it would be much clearer to simply so state:  say that there might be a
null pointer exception.  A better message is:

  Receiver may be null

or

  Reciever debug may be null

or

  Receiver may be null:  debug

or

  Possibly-null receiver debug


2. Another puzzling case is warnings like these:

./daikon/inv/unary/sequence/NoDuplicates.java:116: incompatible types.
found   : @Nullable String
required: @NonNull String
      + form[3];
      ^
./daikon/inv/unary/sequence/NoDuplicates.java:120: incompatible types.
found   : @Nullable String
required: @NonNull String
    return "daikon.Quant.noDups(" + var().name_using(format) + ")";
                                                             ^
./daikon/inv/unary/sequence/EltwiseFloatGreaterThan.java:103: incompatible types.
found   : @Nullable String
required: @NonNull String
    /*@NonNull*/ String result = quant.getQuantifierExp() + "(" + quant.getMembershipRestriction(0) + " /\\ " + quant.getMembershipRestriction(1);
                                                                                                              ^

You can see the code being checked in the second and third cases.
(But, I haven't been successful in creating a small test case for the test
suite.)
The code being checked in the first is this:

  /*@NonNull*/ public String format_simplify() /*@Raw*/  {
    /*@NonNull*/ String[] form = VarInfo.simplify_quantify (QuantFlags.distinct(), var(),
                                               var());
    return form[0] + "(NEQ " + form[1] + " " + form[2] + ")"
      + form[3];
  }

I don't think the problem is with String concatenation -- the checker
passes this method:

  public @NonNull String stringConcatenation(boolean b) {
    if (b)
      return "foo" + null;
    else
      return null + "foo";
  }

so I am not sure how to interpret the checker warning.

3. This error message is not very helpful, either.

./daikon/inv/unary/sequence/NoDuplicates.java:152: cannot dereference the possibly-null reference vis[0]
    if (!vis[0].aux.getFlag(VarInfoAux.HAS_DUPLICATES)) {
               ^

Rather than saying "cannot dereference", I think it's better to state the
possible consequence.  How about something like
  Dereference of possibly-null reference vis[0]
  Possible null pointer exception when dereferencing possibly-null reference vis[0]
  Possibly null pointer exception when dereferencing vis[0]

One thing I really like about this error message, though is that it
explicitly states the name of the reference, "vis[0]".  That is very
helpful, so please retain it, and consider including it in other messages.

                     Thanks,

                    -Mike



More information about the checkers mailing list