メインコンテンツ

AUTOSAR C++14 Rule A5-3-2

Null pointers shall not be dereferenced

説明

ルール定義

Null pointers shall not be dereferenced.

根拠

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

Polyspace 実装

チェッカーは、ポインターが NULL 値の可能性がある場合のポインターのデリファレンスにフラグを設定します。

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

チェッカーの拡張

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

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#include <iostream>
#include <cstdint>
#include <cstddef>

class A
{
  public:
    A(std::uint32_t a) : a(a) {}
    std::uint32_t GetA() const noexcept
    {
      return a;
    }
  private:
    std::uint32_t a;
};

std::uint32_t Sum(const A* lhs, const A* rhs)
{
  return lhs->GetA() + rhs->GetA(); //Noncompliant
}

A* getAPtr(void); 

int main(void)
{
  A* leftVal = new A(3);
  A* rightVal = getAPtr();
  
  std::uint32_t sum;
  
  if(!rightVal)  {
      sum = Sum(leftVal, rightVal); 
  }
  else 
      sum = 0;

  std::cout << sum << std::endl;
  return 0;
}

この例では、ifelse の節の順序が入れ替わっていて、予期しない NULL ポインター デリファレンスを引き起こします。変数 rightVal は NULL チェックが行われ、NULL 値の rightVal がそれに続く関数 Sum でデリファレンスに使用されます。

チェック情報

グループ:
カテゴリ: Required、Partially automated

バージョン履歴

R2020b で導入

すべて展開する