==================
Nullability Checks
==================

This document is a high level description of the nullablility checks.
These checks intended to use the annotations that is described in this
RFC: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2015-March/041798.html.

Let's consider the following 2 categories:

**1) nullable**

If a pointer ``p`` has a nullable annotation and no explicit null check or assert, we should warn in the following cases:

* ``p`` gets implicitly converted into nonnull pointer, for example, we are passing it to a function that takes a nonnull parameter.
* ``p`` gets dereferenced

Taking a branch on nullable pointers are the same like taking branch on null unspecified pointers.

Explicit cast from nullable to nonnul:

.. code-block:: cpp

  __nullable id foo;
  id bar = foo;
  takesNonNull((_nonnull) bar); // should not warn here (backward compatibility hack)
  anotherTakesNonNull(bar); // would be great to warn here, but not necessary(*)

Because bar corresponds to the same symbol all the time it is not easy to implement the checker that way the cast only suppress the first call but not the second. For this reason in the first implementation after a contradictory cast happens, I will treat bar as nullable unspecified, this way all of the warnings will be suppressed. Treating the symbol as nullable unspecified also has an advantage that in case the takesNonNull function body is being inlined, the will be no warning, when the symbol is dereferenced. In case I have time after the initial version I might spend additional time to try to find a more sophisticated solution, in which we would produce the second warning (*).
 
**2) nonnull**

* Dereferencing a nonnull, or sending message to it is ok.
* Converting nonnull to nullable is Ok.
* When there is an explicit cast from nonnull to nullable I will trust the cast (it is probable there for a reason, because this cast does not suppress any warnings or errors).
* But what should we do about null checks?:

.. code-block:: cpp

  __nonnull id takesNonnull(__nonnull id x) {
      if (x == nil) {
          // Defensive backward compatible code:
          ....
          return nil; // Should the analyzer cover this piece of code? Should we require the cast (__nonnull)nil?
      }
      ....
  }

There are these directions:

* We can either take the branch; this way the branch is analyzed
* Should we not warn about any nullability issues in that branch? Probably not, it is ok to break the nullability postconditions when the nullability preconditions are violated.
* We can assume that these pointers are not null and we lose coverage with the analyzer. (This can be implemented either in constraint solver or in the checker itself.)

Other Issues to keep in mind/take care of:

* Messaging:

  * Sending a message to a nullable pointer

    * Even though the method might return a nonnull pointer, when it was sent to a nullable pointer the return type will be nullable.
  	* The result is nullable unless the receiver is known to be non null.

  * Sending a message to a unspecified or nonnull pointer

    * If the pointer is not assumed to be nil, we should be optimistic and use the nullability implied by the method.

      * This will not happen automatically, since the AST will have null unspecified in this case.

Inlining
--------

A symbol may need to be treated differently inside an inlined body. For example, consider these conversions from nonnull to nullable in presence of inlining:

.. code-block:: cpp

  id obj = getNonnull();
  takesNullable(obj);
  takesNonnull(obj);
  
  void takesNullable(nullable id obj) {
     obj->ivar // we should assume obj is nullable and warn here
  }
           
With no special treatment, when the takesNullable is inlined the analyzer will not warn when the obj symbol is dereferenced. One solution for this is to reanalyze takesNullable as a top level function to get possible violations. The alternative method, deducing nullability information from the arguments after inlining is not robust enough (for example there might be more parameters with different nullability, but in the given path the two parameters might end up being the same symbol or there can be nested functions that take different view of the nullability of the same symbol). So the symbol will remain nonnull to avoid false positives but the functions that takes nullable parameters will be analyzed separately as well without inlining.

Annotations on multi level pointers
-----------------------------------

Tracking multiple levels of annotations for pointers pointing to pointers would make the checker more complicated, because this way a vector of nullability qualifiers would be needed to be tracked for each symbol. This is not a big caveat, since once the top level pointer is dereferenced, the symvol for the inner pointer will have the nullability information. The lack of multi level annotation tracking only observable, when multiple levels of pointers are passed to a function which has a parameter with multiple levels of annotations. So for now the checker support the top level nullability qualifiers only.:

.. code-block:: cpp

  int * __nonnull * __nullable p;
  int ** q = p;
  takesStarNullableStarNullable(q);

Implementation notes
--------------------

What to track?

* The checker would track memory regions, and to each relevant region a qualifier information would be attached which is either nullable, nonnull or null unspecified (or contradicted to suppress warnings for a specific region).
* On a branch, where a nullable pointer is known to be non null, the checker treat it as a same way as a pointer annotated as nonnull.
* When there is an explicit cast from a null unspecified to either nonnull or nullable I will trust the cast.
* Unannotated pointers are treated the same way as pointers annotated with nullability unspecified qualifier, unless the region is wrapped in ASSUME_NONNULL macros.
* We might want to implement a callback for entry points to top level functions, where the pointer nullability assumptions would be made.
