メインコンテンツ

AUTOSAR C++14 Rule A7-1-3

CV 修飾子は typedef または using name である型の右側に配置するものとします。

説明

ルール定義

CV 修飾子は typedef または using name である型の右側に配置するものとします。

根拠

typedef または using ステートメントでポインター型が定義されているとします。次に例を示します。

using IntPtr = std::int32_t*;
次のような型の const 修飾は、
const IntPtr ptr = &someValue;
次のように展開されます。
const (std::int32_t*) ptr = &someValue;
この式で、ptr は定数ポインターであるため、他のメモリ位置に再代入できません。しかし、開発者またはレビュー担当者は次の展開を想定する可能性があります。
(const std::intr32_t) *ptr = &someValue;
この式で、ptr は定数へのポインターです。したがって、ptr が指している位置の内容である *ptr は変更できません。

この混乱を回避するには、const または volatile 修飾子を typedef または using を介して定義されたデータ型の右側に配置します。次に例を示します。

IntPtr const ptr = &someValue;
この式の唯一の有効な展開は次のとおりです。
std::intr32_t const *ptr = &someValue;
ptr は定数ポインターになります。

Polyspace 実装

チェッカーは、const 修飾子または volatile 修飾子が typedef ステートメントまたは using ステートメントを介して定義されたデータ型の左側に配置されている場合に違反を報告します。

チェッカーは、ポインター データ型と非ポインター データ型の両方に対する違反を報告します。チェッカーは、std 名前空間で定義された typedefs に対する違反を報告しません。

トラブルシューティング

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

すべて展開する

この例では、const 修飾子が using 名を使用する型の右側に配置された場合に、Polyspace がこのルールの違反を報告します。この違反は、標準 (std) 名前空間の一部である typedef に対しては報告されません。

#include <cstdint>
#include <string>
using int_p = std::int32_t*;
using int_const_p = int32_t* const;
using const_int_p = const int32_t*;
void Fn(const std::uint8_t& input) // Compliant
{
	std::int32_t value1 = 10;
	std::int32_t value2 = 20;

       // deduced type is std::int32_t* const, not const std::int32_t*
	const int_p ptr1 =   // Noncompliant 
	&value1;             

	int_p const ptr2 = // Compliant
	&value1;

	int_const_p ptr3 = &value1;    // Compliant

	const_int_p ptr4 = &value1;    //Compliant
	const const_int_p ptr5 = &value1;    // Noncompliant, type is const std::int32_t* const, 
										//   not const const std::int32_t*
	const_int_p const ptr6 =
	&value1; // Compliant
	const std::string str = "Foo"; //Compliant
}

チェック情報

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

バージョン履歴

R2019a で導入

すべて展開する