メインコンテンツ

CWE Rule 476

NULL Pointer Dereference

R2023a 以降

説明

ルールの説明

A NULL pointer dereference occurs when the application dereferences a pointer that it expects to be valid, but is NULL, typically causing a crash or exit.

Polyspace 実装

ルール チェッカーは、"NULL ポインターのデリファレンス" をチェックします。

すべて展開する

問題

この問題は、NULL 値のポインターを有効なメモリ位置を指しているかのように使用する場合に発生します。0x00 などのゼロ アドレスをデリファレンスした場合、Polyspace® は null アドレスを NULL と同等と見なし、この欠陥を報告します。

リスク

NULL ポインターのデリファレンスは未定義の動作です。ほとんどの実装では、このデリファレンスによってプログラムがクラッシュする可能性があります。

修正方法

デリファレンスの前にポインターが NULL かどうかをチェックします。

以前に NULL かどうかをチェックしていたにもかかわらず、この問題が発生する場合は、このチェックと以降のデリファレンスの間で中間イベントを探します。多くの場合、結果の詳細 (または Polyspace as You Code のソース コード ツールヒント) には欠陥につながる一連のイベントが表示されます。そのシーケンス内のどのイベントについても修正を実装できます。結果の詳細にイベント履歴が表示されない場合は、ソース コード内で右クリック オプションを使用して、欠陥に関連する変数のこれまでの参照を検索し、関連するイベントを検出できます。Polyspace デスクトップ ユーザー インターフェイスでの Bug Finder の結果の解釈またはPolyspace Access Web インターフェイスでの Bug Finder の結果の解釈 (Polyspace Access)も参照してください。

以下の修正例を参照してください。

チェッカーの拡張

入力値が不明であり、入力のサブセットのみがエラーの原因となっている場合、既定の Bug Finder 解析ではこの欠陥が報告されない可能性があります。特定のシステム入力値を原因とする欠陥の有無をチェックするには、より厳密な Bug Finder 解析を実行してください。特定のシステム入力値から欠陥を見つけるための Bug Finder チェッカーの拡張を参照してください。

例 - NULL ポインター エラー
#include <stdlib.h>

int FindMax(int *arr, int Size) 
{
 int* p=NULL;

 *p=arr[0];  //Noncompliant
 /* Defect: Null pointer dereference */

 for(int i=0;i<Size;i++)
  {
   if(arr[i] > (*p))
     *p=arr[i];    
  }

 return *p;
}

ポインター pNULL の値で初期化されます。しかし、値 arr[0]*p に書き込まれるとき、p は有効なメモリ位置を指していると想定されます。

修正 — デリファレンスの前に null ポインターにアドレスを割り当てる

1 つの修正方法として、デリファレンスの前に有効なメモリ アドレスで p を初期化することができます。

#include <stdlib.h>

int FindMax(int *arr, int Size) 
{
 /* Fix: Assign address to null pointer */
 int* p=&arr[0];       

 for(int i=0;i<Size;i++)
  {
   if(arr[i] > (*p))
     *p=arr[i];    
  }

 return *p;
}

チェック情報

カテゴリ: Pointer Issues

バージョン履歴

R2023a で導入