メインコンテンツ

AUTOSAR C++14 Rule A15-4-4

A declaration of non-throwing function shall contain noexcept specification

R2021a 以降

説明

ルール定義

A declaration of non-throwing function shall contain noexcept specification.

根拠

指定子の noexcept または noexcept(true) を使用して、例外を発生させない関数を指定すると、コンパイラはそれらの関数に対して特定の最適化 (例外処理プロセスの省略など) を実行できます。関数の例外指定を指定することにより、その関数では例外を発生させないという意図を明確に伝達できます。

指定子の noexcept を使用して、例外を発生させない関数を指定します。関数の例外指定がテンプレート引数によって異なる場合は noexcept(<condition>) を使用します。関数の例外指定が不明な場合は、例外が発生すると仮定します。

Polyspace 実装

Polyspace® は以下が当てはまる場合に、関数、クラス、関数テンプレート、クラス コンストラクターなどの呼び出し可能なエンティティの定義にフラグを設定します。

  • 呼び出し可能なエンティティが定義されます。Polyspace は、宣言されているが定義されていない関数にフラグを設定しません。また、Polyspace は、少なくとも 1 つのインスタンス化を含む関数またはクラス テンプレートをチェックします。

  • 呼び出し可能なエンティティは例外を発生させません。クラスと関数のテンプレートの場合は、少なくとも 1 つのインスタンス化で例外が発生しません。呼び出し可能なエンティティの例外をチェックするとき Polyspace は、定義のない外部関数が noexcept(true) として機能することを前提とします。呼び出し可能なエンティティで例外が発生するかどうかを Polyspace がチェックする方法の詳細については、AUTOSAR C++14 Rule A15-4-2 の Polyspace 実装のセクションを参照してください。

  • 呼び出し可能なエンティティには例外指定がありません。

トラブルシューティング

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

すべて展開する

#include <iostream>
#include <stdexcept>
void F1();  
void F2() noexcept; 
void F3() noexcept(true); 
void F4() noexcept(false); 

void F5(){ //Noncompliant

	F2();    
	F3();    

}

void F6() noexcept    // Compliant
{
	try {
		F4();   
	}catch (std::exception& e) {
		// Handle exceptions
	}
}

class NotThrowing {
public:
	NotThrowing() { // Noncompliant
		F2();
	}
};

class Throwing{
public:
	Throwing() { // Compliant 
		F4();
	}
};
template <class T, bool B> void CompliantClasshandler() noexcept(B) { //Compliant
	//...
}

template <class T> void NoncompliantClasshandler() { // Noncompliant
	//...
}

int Factory() noexcept{
	Throwing a;
	NotThrowing b;
	NoncompliantClasshandler<Throwing>();
	NoncompliantClasshandler<NotThrowing>();
	CompliantClasshandler<Throwing, true>();
	CompliantClasshandler<NotThrowing, false>();
	return 1;
}

  • 関数 F5 は例外を発生させませんが、コード内で noexcept としてマークされません。Polyspace はこの関数の定義にフラグを設定します。関数 F6 は例外を発生させず、コード内で noexcept として指定されます。Polyspace は F6 にフラグを設定しません。

  • クラスがコード内で使用されている場合に、Polyspace はクラスのコンストラクターをチェックします。この例では、クラスの ThrowingNotThrowing がインスタンス化され、Polyspace がそれらのコンストラクターをチェックします。

    クラス NotThrowing のコンストラクターは例外を発生させませんが、コード内で noexcept として指定されません。Polyspace はこの関数にフラグを設定します。クラス Throwing のコンストラクターは例外を発生させ、コード内で noexcept として指定されません。Polyspace はこのコンストラクターにフラグを設定しません。

  • Polyspace は、テンプレートがインスタンス化されるときに関数テンプレートをチェックします。この例では、テンプレート CompliantClasshandlerNoncompliantClasshandlerFactory でインスタンス化されているため、それらをPolyspace がチェックします。

    クラス NotThrowing を使用した Factory での NoncompliantClasshandler のインスタンス化は、例外を発生させないものの、テンプレートがコード内で noexcept として指定されないため、Polyspace は NoncompliantClasshandler の定義にフラグを設定します。Polyspace はテンプレート CompliantClasshandler にフラグを設定しません。これは、このテンプレートがコード内の条件付きの noexcept 演算子によって指定されるためです。

チェック情報

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

バージョン履歴

R2021a で導入

すべて展開する