メインコンテンツ

AUTOSAR C++14 Rule A5-2-2

Traditional C-style casts shall not be used

説明

ルール定義

従来の C スタイルのキャストを使用してはなりません。

根拠

C スタイルのキャストは、ソース コード内での区別が困難です。このようなキャストでは、変換の目的と必要性が明確に伝わりません。C スタイルのキャストを含むコードは、理解やデバッグが困難です。

C スタイルのキャストは避けてください。C++ では、識別が容易で、各キャストの目的と必要性が明確に伝わる、明示的なキャスト操作が導入されています。代わりに、以下のキャスト操作を使用してください。

Polyspace 実装

Polyspace® は、コード内の C スタイルのキャストと関数表記のキャストにフラグを設定します。準拠した C++ スタイルのキャスト操作には以下が含まれます。

  • std::static_cast

  • std::reinterpret_cast

  • std::const_cast

  • std::dynamic_cast

  • {} 表記のキャスト

Boost ライブラリからの reference_cast 操作と Microsoft® ライブラリからの safe_cast 操作も許可されます。

トラブルシューティング

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

すべて展開する

この例では、関数 Foo() に複数の C++ キャスト操作が含まれています。これらの操作は識別が容易です。これらの操作では、キャスト操作の目的と必要性が明確に伝わります。たとえば、Base* obj4 = const_cast<Base*>(&obj3) では、キャスト操作によって obj3 から const 修飾子が削除されることが明らかです。これらのキャスト操作は準拠しているため、Polyspace はこのような操作にフラグを設定しません。

関数 Bar() には、複数の C スタイルのキャストと関数表記のキャストが含まれています。これらの操作は見つけにくく、その目的が明確ではありません。Polyspace は、これらのキャストにフラグを設定します。

#include <cstdint>
class Base
{
public:
	explicit Base(std::int32_t) {}
	virtual void Fn() noexcept {}
};
class Derived : public Base
{
public:
	void Fn() noexcept override {}
};
class myClass
{
};
std::int32_t G() noexcept
{
	return 7;
}

void Foo() noexcept(false)
{
	Base obj = Base{10};        // Compliant
	const Base obj3(5);
	Base* obj4 = const_cast<Base*>(&obj3);        //Compliant
	Base* obj2;
	myClass* d1 = reinterpret_cast<myClass*>(obj4); // Compliant 
	Derived* d2 = dynamic_cast<Derived*>(obj2);       // Compliant
	std::int16_t var1 = 20;
	std::int32_t var2 = static_cast<std::int32_t>(var1);      // Compliant
	std::int32_t var4 = 10;
	float f1 = static_cast<float>(var4);                    // Compliant

	std::int32_t var5 = static_cast<std::int32_t>(f1);      //Compliant

	std::uint32_t var7 = std::uint32_t{0};//Compliant
	static_cast<void>(G());                               //Compliant
}
void Bar(){
	Base obj = Base{1};
	Base* obj2 = (Base*)(&obj); //Noncompliant
	std::int16_t var1 = 20;
	std::int32_t var3 = (std::int32_t)var1;                   // Noncompliant
	float f = float(var3);                                 // Noncompliant
	std::int32_t var6 = (std::int32_t)f;                   // Noncompliant
	std::int32_t var7 = std::int32_t(f);                   // Noncompliant
}

チェック情報

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

バージョン履歴

R2019a で導入

すべて展開する