メインコンテンツ

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

MISRA C++:2023 Rule 8.2.2

C-style casts and functional notation casts shall not be used

R2024b 以降

説明

ルール定義

C-style casts and functional notation casts shall not be used. 1

根拠

C スタイルのキャストは、ソース コード内での区別が困難です。ある型から別の型にキャストするという開発者の意図が伝わりません。C スタイルのキャストを含むコードは、わかりにくく、デバッグが困難です。C スタイルのキャストは避けてください。

C++ では、識別が容易で、各キャストの背後にある開発者の意図が明確に伝わる、明示的なキャスト操作が導入されています。代わりに、以下のキャスト操作を使用してください。

Polyspace 実装

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

  • std::static_cast

  • std::reinterpret_cast

  • std::const_cast

  • std::dynamic_cast

  • {} 表記を使用したキャスト

加えて、Boost ライブラリからの reference_cast 操作と Miscrosoft ライブラリからの safe_cast 操作も許可されます。

トラブルシューティング

ルール違反が想定されるものの、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
}

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

関数 Bar() には、複数の C スタイルのキャストが含まれています。これらの操作は理解が困難です。Polyspace はこれらの C スタイルのキャストにフラグを設定します。

チェック情報

グループ: Expressions
カテゴリ: Required

バージョン履歴

R2024b で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.