EN JP CN

RNPD.CALL

RNPD.CALL

null チェック前の関数呼び出し時のポインターの不審な逆参照

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

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

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

脆弱性とリスク

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

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

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

軽減と防止

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

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

脆弱コード例

1   void deref(int *p){
2         *p = *p + 10;
3   }
4  
5   void rnpd_2(int *t){
6  
7         deref(t);
8         if (!t) return;
9     *t ++;
10  }

この例では、コードは 't' を 2 回逆参照します。 1 回目は、関数 deref() への呼び出しによって確認なしで行われます。Klocwork7 行目の逆参照の後に null チェックが発生する 8 行目にフラグを立てます。もちろん、ポインターが null の場合は、1 回目の逆参照の後にアプリケーションはクラッシュします。

関連チェッカー