A null pointer holds no usable object address, so code checks it before dereferencing.

null `0` is a null pointer constant when assigned to a pointer.
guard Check a pointer before using `*ptr`.

Null Pointers

useValue
null_pointers.c
Replay: real traced execution (multi-file project)
#include <stdio.h>

int main(void) {
    int value = 9;
    int useValue = 1;
    int *ptr = 0;

    if (useValue) {
        ptr = &value;
    }

    if (ptr != 0) {
        printf("value=%d\n", *ptr);
    } else {
        printf("value=missing\n");
    }

    return 0;
}
#include <stdio.h>

int main(void) {
    int value = 9;
    int useValue = 0;
    int *ptr = 0;

    if (useValue) {
        ptr = &value;
    }

    if (ptr != 0) {
        printf("value=%d\n", *ptr);
    } else {
        printf("value=missing\n");
    }

    return 0;
}
  1. value ← 9, useValue ← 1, ptr ← 0

    3int main(void) {4    int value→ 9 = 9;5    int useValue→ 1 = 1; //@useValue=06    int *ptr→ 0 = 0;
  2. ptr ← ⟨addr A⟩

    8if (useValue1) {9    ptr→ ⟨addr A⟩ = &value9;10}
  3. if (ptr != 0)

    12if (ptr⟨addr A⟩ != 0) {13    printf("value=%d\n", *ptr⟨addr A⟩);14} else {
    outputvalue=9
  4. return 0;

    18    return 0;19}
  1. value ← 9, useValue ← 0, ptr ← 0

    3int main(void) {4    int value→ 9 = 9;5    int useValue→ 0 = 0;6    int *ptr→ 0 = 0;
  2. else

    13    printf("value=%d\n", *ptr);14} else {15    printf("value=missing\n");16}
    outputvalue=missing
  3. return 0;

    18    return 0;19}

Check Before Use

  1. A pointer either stores a real address or 0.
  2. 0 means there is no object to read.
  3. Test the pointer before using *ptr.
  4. Only the non-null branch should dereference it. | Pointer value | Safe next step | | --- | --- | | Real address | Use *ptr. | | 0 | Return or print an error. |

Exercise: null_pointers.c

Guard a pointer before dereferencing it and return an error status when the pointer is null