メインコンテンツ

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

MISRA C++:2008 Rule 0-1-4

A project shall not contain non-volatile POD variables having only one use

説明

ルール定義

A project shall not contain non-volatile POD variables having only one use. 1

根拠

非 volatile 変数を Plain Old Data 型 (intdouble など) と一緒に "1 回だけ" 使用する場合は、その変数を定数リテラルで置き換えることができます。変数の使用方法が、その変数を複数回使用することを示していたため、コード内でプログラミング エラーが発生した可能性があります。非 volatile 変数の他の使用を省略していたか、意図される使用場所で誤って他の変数を使用した可能性があります。

Polyspace 実装

チェッカーは、一度だけ使用される関数スコープ (ローカルに静的) とファイル スコープを持つローカル変数と静的変数にフラグを設定します。チェッカーは、extern 指定子のない const 修飾付きグローバル変数をファイル スコープを持つ静的変数と見なします。

チェッカーは、以下のユース ケースを非 volatile 変数の 1 回の使用としてカウントします。

  • 定数リテラルまたは関数の戻り値を使用した明示的な初期化

  • 割り当て

  • 読み取り操作などの変数への参照

  • ポインターへの変数アドレスの割り当て

ポインターに変数アドレスが割り当てられている場合、チェッカーは、そのポインターが後でデリファレンスされる可能性があると仮定して、その変数にフラグを設定しません。

一部のオブジェクトは、セマンティクスによって 1 回だけ使用されるように設計されています。Polyspace® は、このようなオブジェクトの 1 回の使用にフラグを設定しません。

  • lock_guard

  • scoped_lock

  • shared_lock

  • unique_lock

  • thread

  • future

  • shared_future

前述のリスト内のオブジェクトと同様の機能を提供する非標準オブジェクトを使用する場合は、Polyspace が非標準オブジェクトの 1 回の使用にフラグを設定することがあります。コメントを使用することによって、この 1 回の使用を正当化します。

トラブルシューティング

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

すべて展開する

#include <mutex>
int readStatus1();
int readStatus2();
void getReading(int*);
extern std::mutex m;
void foo()
{
	// Initiating lock 'lk'
	std::lock_guard<std::mutex> lk{m};   
	int checkEngineStatus1 = readStatus1();
	int checkEngineStatus2 = readStatus2();//Noncompliant
	int sensorData;//Noncompliant
	getReading(&sensorData);
	if(checkEngineStatus1) {
		//Perform some actions if both statuses are valid   
	}
	// Release lock when 'lk' is deleted at exit point of scope
}

この例では、変数 checkEngineStatus2 が 1 回だけ使用されます。この変数の 1 回の使用は、プログラミング エラーを示す可能性があります。たとえば、if 条件で checkEngineStatus1checkEngineStatus2 の両方をチェックしようとしたが、2 回目のチェックを省略したとします。変数 sensorData もそのアドレスが関数 getReading() に渡される際に 1 回だけ使用されます。Polyspace は、これらの 1 回限り使用される変数にフラグを設定します。

lock_guard オブジェクト lk は 1 回だけ使用されます。lock_guard オブジェクトのセマンティクスによってその 1 回の使用が正当化されるため、Polyspace はそれにフラグを設定しません。

チェック情報

グループ: Language Independent Issues
カテゴリ: 必要

バージョン履歴

R2020b で導入

すべて展開する


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.