メインコンテンツ

AUTOSAR C++14 Rule M9-3-3

If a member function can be made static then it shall be made static, otherwise if it can be made const then it shall be made const

説明

ルール定義

メンバー関数は static にできる場合は static にされます。また、const にできる場合は const にされます。

根拠

const メンバー関数で、クラスのデータ メンバーに変更を加えることはできません。static メンバー関数で、クラスの非静的データ メンバーに変更を加えることはできません。メンバー関数でクラスの非静的データ メンバーに変更を加える必要がない場合は、メンバー関数を const または static として宣言して、データへのアクセスを制限します。このような宣言は明確に設計の意図を表し、強制します。つまり、不注意に const メンバー関数を使用してデータ メンバーに変更を加えようとすると、コンパイラがエラーを捕捉します。const 宣言を使用しないと、このような不注意によるエラーが、検出やデバッグが難しいバグにつながる可能性があります。

Polyspace 実装

チェッカーはこれらのチェックを次の順に実行します。

  1. チェッカーはまず、クラスのメンバー関数がクラスのデータ メンバーにアクセスするかどうかをチェックします。データ メンバーにアクセスしない関数は static と宣言できます。

  2. チェッカーはデータ メンバーにアクセスする関数をチェックして、関数がいずれかのデータ メンバーを変更するかどうかを判断します。データ メンバーを変更しない関数は const と宣言できます。

const メンバー関数での違反は、その関数がクラスのデータ メンバーにアクセスせず、static と宣言できることを意味します。

トラブルシューティング

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

すべて展開する

#include<cstdint>
void Connector(void);
class A
{
public:
	int16_t foo ( ) // Noncompliant 
	{
		return m_i;
	}
	int16_t foo2 ( ) // Noncompliant 
	{
		Connector();// Might have side-effect
		return m_i;
	}
	int16_t foo3 ( ) // Noncompliant
	{
		return m_s;
	}
	int16_t inc_m ( ) // Compliant 
	{
		return ++m_i;
	}
	int16_t& getref()//Noncompliant 
	{
		return m_i_ref; 
	}
private:
	int16_t m_i;
	static int16_t m_s;
	int16_t& m_i_ref;
};

この例では、Polyspace は関数 foofoo2foo3、および getref に、非準拠としてフラグを設定します。

  • 関数 foofoo3 は、非静的データ メンバーに変更を加えません。const として宣言されて明示的にデータ アクセスが制限されていないため、Polyspace はこれらの関数にフラグを設定します。この欠陥を修正するには、foofoo3const として宣言します。

  • 関数 foo2 はいずれのデータ メンバーにも明示的な変更を加えません。const として宣言されていないため、Polyspace はこの関数にフラグを設定します。foo2 はグローバル関数 Connector を呼び出すことから、副次的影響をもたらす可能性があります。foo2const 関数として宣言しないでください。C++11 以降では、const メンバー関数はスレッドセーフであると想定されますが、foo2Connector の副次的影響により、スレッドセーフにはならない可能性があります。データ レースを回避するには、foo2 を非 const 関数のままにしてください。この欠陥を正当化するには、レビュー情報またはコード コメントを使用します。

  • 関数 getref はいずれのデータ メンバーにも変更を加えません。const として宣言されていないため、Polyspace はこれにフラグを設定します。getrefconst として宣言するとこの欠陥は解決されますが、getrefm_i_ref の非 const 参照を返すため、その書き込みアクセスを制限するには不十分です。getrefm_i_ref に変更を加えられないようにするには、getref の戻り値の型も const でなければなりません。

チェック情報

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

バージョン履歴

R2019a で導入

すべて展開する