メインコンテンツ

部分的にアクセスされる配列

スコープ終了前に部分的に読み取りまたは書き込みされる配列

説明

この欠陥は、配列スコープの終了前に配列が部分的に読み書きされた場合に発生します。関数に対しローカルな配列では、スコープの終了は関数の終了時に発生します。

リスク

部分的にアクセスされる配列は多くの場合、コードの欠落を示します。たとえば、ループを使用して配列を並べ替えるときに、ある配列要素を読み取ることができないループ反復回数を使用したとします。この実装では、配列が完全には並べ替えられない可能性があります。

修正方法

修正方法は欠陥の根本原因によって異なります。たとえば、ループの反復回数が不適切であることが根本原因の場合、ループの範囲を変更するかループの後にステップを追加して、読み取られていない要素または書き込まれていない要素にアクセスします。

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

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

すべて展開する

int Calc_Sum(void) 
{
  int tab[5]={0,1,2,3,4},sum=0;  
  /* Defect: tab[4] is not read */ 
  
  for (int i=0; i<4;i++) sum+=tab[i];
  
  return(sum);

 }

配列 tab は、関数 Calc_Sum が終了する前に部分的にのみ読み取られます。sum の計算において tab[4] は含められません。

修正 — すべての配列要素にアクセス

1 つの修正方法として、配列 tab のすべての要素を読み取ることができます。

int Calc_Sum(void) 
{
  int tab[5]={0,1,2,3,4},sum=0;   
  
  /* Fix: Include tab[4] in calculating sum */
  for (int i=0; i<5;i++) sum+=tab[i]; 
  
  return(sum);

 }

結果情報

グループ: データ フロー
言語: C | C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: PARTIALLY_ACCESSED_ARRAY
影響度: Low

バージョン履歴

R2013b で導入