メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

CWE Rule 824

Access of Uninitialized Pointer

R2023a 以降

説明

ルールの説明

The program accesses or uses a pointer that has not been initialized.

Polyspace 実装

このルール チェッカーは、[未初期化ポインター] をチェックします。

すべて展開する

問題

この問題は、デリファレンスの前にポインターにアドレスが割り当てられていなかった場合に発生します。

リスク

ポインターにアドレスが明示的に割り当てられていない場合、そのポインターは予測できない位置を指します。

修正方法

修正方法は欠陥の根本原因によって異なります。たとえば、アドレスをポインターに割り当てたが、その割り当てに到達不能である場合があります。

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

以下の修正例を参照してください。ポインターを宣言するときはポインターを NULL に初期化することをお勧めします。

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

チェッカーの拡張

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

例 — 未初期化ポインター エラー
#include <stdlib.h>

int* assign_pointer(int* prev)
{
    int j = 42;
    int* pi;

    if (prev == NULL) 
      {
        pi = (int*)malloc(sizeof(int));
        if (pi == NULL) return NULL;
      }

    *pi = j;   //Noncompliant
    /* Defect: Writing to uninitialized pointer */

    return pi;
}

prevNULL でない場合、ポインター pi にはアドレスが割り当てられません。しかし、prevNULL かどうかにかかわりなく、pi はすべての実行パスでデリファレンスされます。

修正 — すべての実行パスでポインターを初期化

1 つの修正方法として、prevNULL でない場合に pi にアドレスを割り当てることができます。

#include <stdlib.h>

int* assign_pointer(int* prev)
{
    int j = 42;
    int* pi;

    if (prev == NULL) 
       {
        pi = (int*)malloc(sizeof(int));
        if (pi == NULL) return NULL;
       } 
    /* Fix: Initialize pi in branches of if statement  */
    else 
        pi = prev;              
    

    *pi = j;

    return pi;
}

チェック情報

カテゴリ: Pointer Issues

バージョン履歴

R2023a で導入