EN JP CN

NPD.GEN.MIGHT

NPD.GEN.MIGHT

割り当てられた null ポインターの定数値が逆参照される場合があります

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

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

NPD.GEN.MIGHT チェッカーは、null 定数値をローカルで割り当てられたポインターが null についてチェックしないでそれを逆参照する可能性がある関数に後で渡されるかまたは明示的に逆参照される可能性がある状況にフラグを立てます。

脆弱性とリスク

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

軽減と防止

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

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

脆弱コード例

1  void xstrcpy(char *dst, char *src) {
2    if (!src) return;
3    dst[0] = src[0];
4  }
5  
6  char global_buf[256];
7  
8  void npd_gen_might(int flag, char *arg) {
9    char *p = global_buf;
10   if (flag) p = NULL;
11   if (arg) { p = arg; }
12   xstrcpy(p, "Hello");
13 }

Klocwork は 3 行目で、逆参照されるポインター 'dst' が null の可能性があることを示す指摘レポートを生成します。'flag' が true であることを条件に、'p' に割り当てられる定数 null は、それが逆参照される関数 xstrcpy に渡されます。フィールドNPD.GEN.MIGHT チェッカーは、null に等しいポインターを逆参照するコードを検索します。この例では、条件 'arg' が true の場合に 'p' が値を変更する可能性があるため、MUST ではなく MIGHT 指摘が報告されます。このタイプの脆弱性が原因で、予期しない結果や意図しない結果となる可能性があります。

修正コード例

1  void xstrcpy(char *dst, char *src) {
2    if (!src) return;
3    if (!dst) return;
4    dst[0] = src[0];
5  }
6  
7  char global_buf[256];
8  
9  void npd_gen_might(int flag, char *arg) {
10   char *p = global_buf;
11   if (flag) p = NULL;
12   if (arg) { p = arg; }
13   xstrcpy(p, "Hello");
14 }

修正されたコード例では、ポインター 'dst' が null の場合に関数 'xstrcpy' は 3 行目で戻り、4 行目での null ポインター逆参照を防ぎます。

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、C/C++ 解析のチューニングを参照してください。