メインコンテンツ

NULL ポインターを使用した算術演算

NULL ポインターに対し実行された算術演算

説明

この欠陥は、値が NULL であるポインターが算術演算で使用された場合に発生します。

リスク

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

修正方法

ポインターでの算術演算の前にポインターが NULL かどうかをチェックします。

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

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

すべて展開する

#include<stdlib.h>

int Check_Next_Value(int *loc, int val) 
 {
  int *ptr = loc, found = 0; 
  
  if (ptr==NULL)
   { 
      ptr++; 
      /* Defect: NULL pointer shifted */

      if (*ptr==val) found=1;
   } 
   
  return(found);    
 }

ptrNULL ポインターである場合、このコードは if ステートメントの本体に入ります。したがって、NULL ポインターはステートメント ptr++ でシフトします。

修正 — NULL ポインターの算術演算を行わない

1 つの修正方法として、ptrNULL でないときに算術演算を実行することができます。

#include<stdlib.h>

int Check_Next_Value(int *loc, int val) 
 {
  int *ptr = loc, found = 0; 
  
  /* Fix: Perform operation when ptr is not NULL */
  if (ptr!=NULL)
   { 
      ptr++;

      if (*ptr==val) found=1;
   }
   
  return(found);    
 }

結果情報

グループ: 静的メモリ
言語: C | C++
既定値: オフ
コマンド ライン構文: NULL_PTR_ARITH
影響度: Low

バージョン履歴

R2013b で導入

すべて展開する