EN JP CN

RNPD.DEREF

RNPD.DEREF

null チェック前のポインターの不審な逆参照

null ポインターを使用してデータにアクセスしようとすると、ランタイムエラーが発生します。有効だと思っていたのに実際は null だと判明したポインターをプログラムが逆参照すると、null ポインター逆参照が起こります。null ポインター逆参照欠陥は、エラー処理または競合状態が無効なためにしばしば起こります。通常、プログラム終了の異常が発生します。ポインターが C/C++ コードにおいて逆参照される前に、null に等しくないことを確認するためにチェックする必要があります。

NPD チェッカーは、null または null ポインターが逆参照されるインスタンスを探します。

RNPD.DEREF チェッカーは、null チェックの前にポインターが逆参照されるインスタンスを検出します。逆参照とチェックの間の追跡でポインターの変更がない場合、逆参照でポインターが null になるか、または null チェックが不適切になる可能性が高くなります。

脆弱性とリスク

通常、null ポインターの逆参照は、プロセスに失敗する結果となります。これらの指摘は通常、無効な例外処理が原因で発生します。

null チェック前の逆参照は次のような結果となる可能性があります。

  • ポインターが null であった場合、ランタイムエラー
  • 書かれている条件が不正確である場合、意図しないプログラムの結果
  • 冗長なチェックがある場合、不要なコードの生成

軽減と防止

この脆弱性を回避するには、次の操作を実行します。

  • 値を返すすべての関数の結果において null 値についてチェックします
  • すべての外部入力が検証されていることを確認します
  • 変数を明示的に初期化します
  • 異常な例外が正確に処理されていることを確認します

脆弱コード例

1  void rnpd_1(int* t, int v) {
2      *t = 0;  // t is dereferenced unconditionally
3      if (v < 0) v = -v;
4      if (t) *t = v;  // t is verified before dereference
5  }

この例では、コードは 't' を 2 回逆参照します。 1 回目は 2 行目で、確認なしで行われます。 2 回目は 4 行目で、null チェックで保護されています。Klocwork逆参照の後に null チェックが発生する 4 行目にフラグを立てます。もちろん、ポインターが null の場合は、1 回目の逆参照の後にアプリケーションはクラッシュします。

関連チェッカー