メインコンテンツ

AUTOSAR C++14 Rule A8-4-10

A parameter shall be passed by reference if it can't be NULL

R2021a 以降

説明

ルール定義

A parameter shall be passed by reference if it can't be NULL

根拠

参照は NULL にすることができません。パラメーターが必要な (NULL にできない) 場合は、そのパラメーターを参照で渡して、自分の意図を明確にします。参照で渡すことで、コードがより明確にもなります。これは、パラメーターを使用する前にそれが NULL かどうかをチェックする必要がないためです。

Polyspace 実装

Polyspace® は、以下の場合を除いて、ポインターで渡されるパラメーターにフラグを設定します。

  • ポインターが std::shared_ptr などのスマート ポインターである。

  • ポインターが関数内でデリファレンスされていない。

  • デリファレンス後にチェックが行われた場合でも、ポインターが NULL に対してチェックされない。

トラブルシューティング

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

すべて展開する

#include <iostream>
#include <vector>

void other_func(std::vector<int32_t>*);

void func(std::vector<int32_t>* v_ptr1, //  Non-Compliant
             std::vector<int32_t>* v_ptr2, //  Compliant
             std::vector<int32_t>* v_ptr3) //  Compliant
{

    auto v = v_ptr1;
    auto ptr_size = 0;
    if (v_ptr2 != NULL) {
        ptr_size = v_ptr2->size();
    }
    v->resize(ptr_size);

    other_func(v_ptr3);
    //....

}

この例では、ポインターで渡されるパラメーター v_ptr1 がルールに違反しています。これは、ポインターが NULL かどうかをチェックせずに、func 内でパラメーターがデリファレンスされているためです。v_ptr1 を NULL にできない場合は、このパラメーターを参照で渡します。v_ptr1 を NULL にできる場合は、デリファレンスする前にポインターが NULL かどうかをチェックして、セグメンテーション違反を回避します。

v_ptr2 パラメーターはルールに準拠しています。これは、NULL に対してチェックされ、NULL にできることを示しているためです。

v_ptr3 はルールに準拠しています。これは、func 内でデリファレンスされていないためです。

チェック情報

グループ: 宣言子
カテゴリ: Required、Automated

バージョン履歴

R2021a で導入