メインコンテンツ

未初期化値へのポインターが定数ポインターに変換

定数へのポインターに値を含まないアドレスが割り当てられている

説明

この欠陥は、値が設定されていないアドレスが定数へのポインター (const int*const char* など) に割り当てられた場合に発生します。

次に例を示します。

int x; const int * ptr = &x;

リスク

定数へのポインターは、プログラム内で後で変更されない値を格納します。未初期化変数のアドレスをポインターに割り当てると、このポインターはプログラムの残りに対するゴミ値をもつアドレスを指します。

修正方法

定数へのポインターに変数のアドレスを割り当てる前に、その変数を初期化します。

チェッカーの拡張

特定のシステム入力値の場合にのみ const ポインターが正しく初期化されない場合は、欠陥を引き起こす可能性のある入力値の組み合わせの 1 つと見なすことができます。特定のシステム入力値から欠陥を見つけるための Bug Finder チェッカーの拡張を参照してください。

すべて展開する

#include<stdio.h>

void Display_Parity()
 {
  int num,parity;
  const int* num_ptr = &num;  
  /* Defect: Address &num does not store a value */

  printf("Enter a number\n:");
  scanf("%d",&num);

  parity=((*num_ptr)%2);
  if(parity==0)
    printf("The number is even.");
  else
    printf("The number is odd.");

 }

num_ptr は定数へのポインターとして宣言されています。しかし、num_ptr にアドレス &num が割り当てられるとき、変数 num には値が含まれていません。

修正 — const ポインターに変数のアドレスを割り当てる前にその変数を初期化する

1 つの修正方法として、&numnum_ptr に割り当てられる前に、ユーザーから num の値を取得することができます。

#include<stdio.h>

void Display_Parity()
 {
  int num,parity;
  const int* num_ptr;

  printf("Enter a number\n:");
  scanf("%d",&num);

 /* Fix: Assign &num to pointer after it receives a value */ 
  num_ptr=&num;                     
  parity=((*num_ptr)%2);
  if(parity==0)
    printf("The number is even.");
  else
    printf("The number is odd.");
 }

scanf ステートメントは値を &num に保存します。値が保存されたら、&numnum_ptr に適正に割り当てられます。

#include <stdlib.h>

int isElementInArray(const int* arr, const int elem);
void fillArray(int *);

void createArray(int elem) {
    int* arr = (int*) malloc (100*sizeof(int));
    isElementInArray(arr, elem);
}

この例では、関数 isElementInArray は最初の引数として const 変数へのポインターを取っています。const 指定子は、関数がポインターの指す値を変更するのではなく読み取ることを示しています。ただし、この関数に渡される配列は初期化されていません。配列要素のみを読み取ることができる関数 isElementInArray が、未初期化の要素を読み取ります。

修正 – const ポインターに代入する前に、メモリを初期化する

動的に割り当てられたメモリのアドレスを const ポインターに代入する前に、そのメモリを初期化します。この例では、関数 fillArray を使用して配列の初期化が行われます。

#include <stdlib.h>

int isElementInArray(const int* arr, const int elem);
void fillArray(int *);

void createArray(int elem) {
    int* arr = (int*) malloc (100*sizeof(int));
    fillArray(arr);
    isElementInArray(arr, elem);
}

結果情報

グループ: データ フロー
言語: C | C++
既定値: オフ
コマンド ライン構文: NON_INIT_PTR_CONV
影響度: Medium

バージョン履歴

R2013b で導入