.. _readme-nil-checking: ============================= Checking for Nil Dereferences ============================= The Chapel compiler includes two different mechanisms to check for nil dereferences. First, at compile-time, the compiler looks for places where it can prove a `nil` will be dereferenced or a method called on `nil`. When it can find such a case, it raises an error. The second mechanism is a run-time check inserted at each method call on an object. It checks that the receiver object is not `nil`. These checks are on by default and can be disabled by `--fast`, `--no-checks`, or `--no-nil-checks`. Example of Compile-time Nil Checking ==================================== Consider this example program: .. code-block:: chapel // ex.chpl class MyClass { var x: int; proc method() { } } var obj: MyClass; // default initializes obj to store nil obj.method(); var x = new owned MyClass(1); var y = owned.release(x); // now x stores nil x.method(); Compiling this program will produce the following compilation errors: :: ex.chpl:9: error: attempt to dereference nil ex.chpl:9: note: variable obj is nil at this point ex.chpl:8: note: this statement may be relevant ex.chpl:13: error: attempt to dereference nil ex.chpl:12: note: this statement may be relevant Limitations of Compile-time Nil Checking ======================================== The compiler analysis for nil checking only does per-function analysis using very conservative alias analysis rules. It cannot detect all cases where a nil is dereferenced. Here are some limitations of the analysis: * it gives up in certain complex control flow situations * it does not track may-alias sets * it is not interprocedural Nonetheless we hope that the additional checking provided by this pass is useful. If you run into a surprising case where it reports an error, please file a bug report. Also, note that using the compiler flag ``--no-compile-time-nil-checking`` will disable these checks. However, the exact nature of the checking and the name of the flag are likely to change in future releases.