仕様に不適合のNULLをチェックするというフールプルーフ

以下のC++関数はコメントが関数仕様の一部であるとした場合。

/**
 * @param[in] foo なにかのオブジェクトのポインタ。NULL不可
 * @note fooが無効オブジェクトを指している(!*fooが真である)ならば何もしない
 */
void Hoge(Foo* foo)
{
    if (! foo)
    {
         return;
    }
    if (! *foo)
    {
         return;
    }

関数仕様としてNULL不可と書いている以上、NULLを引数として関数を呼び出した方に全面的に責任がある。とはいえ人間には間違いもあるからと「NULLを渡された場合は念のため何もしないであげる」ことを可とするか否か。

/**
 * @param[in] foo なにかのオブジェクトの参照
 * @note fooが無効オブジェクト(!fooが真である)ならば何もしない
 */
void Hoge(Foo& foo)
{
    if (! &foo)
    {
        return;
    }
    if (! foo)
    {
         return;
    }

「適格に定義されたプログラムには、空の参照は、ありえない(JIS X 3014:2003 §8.3.2/4)」ので、言語規格上は空の参照を引数として関数を呼び出した方全面的に責任がある。とはいえ適格にプログラムを定義できる人ばかりではないからと「空の参照を渡された場合でも検査可能な(実際に逆参照されるまで不正な参照とならないような)処理系があるなら識別して何もしないであげる」ことを可とするか否か。

これはおそらく「コーディングルール次第」となる。

  1. 「関数仕様を守らない」と「言語規格(言語仕様)を守らない」はどちらも等しく「仕様を守らない方が悪い」ので、どちらのNULLチェックも不可と判断する
  2. ポインタ渡しの方は少なくとも言語規格には適合しているので可と判断し、参照渡しの方はそもそも空の参照という状態が言語規格で未定義なので不可と判断する
  3. ターゲットの環境では空の参照であっても逆参照されるまでは違反にならないから、参照渡しの方のNULLチェックも可と判断する

開発者の能力や、成果物に求められる品質次第で、どのルールも選ばれ得る。もっとも、3番を選ぶくらいなら「参照の使用を禁止」した方がスマートだと思うが。