メインコンテンツ

AUTOSAR C++14 Rule A6-5-2

A for loop shall contain a single loop-counter which shall not have floating-point type

説明

ルール定義

A for loop shall contain a single loop-counter which shall not have floating-point type.

根拠

コードに for ループがあり、ループ カウンターがない場合は、for ループを while ループに置き換えます。

浮動小数点算術演算では、有限の表現に収まるように浮動小数点型が丸められます。これによって丸め誤差が生じるため、ループ カウンターの比較時に予期しない結果になる可能性があります。

Polyspace 実装

このルール チェッカーは、次の場合にルール違反を報告します。

  • for ループのインデックスが浮動小数点型である。

  • for ループのインクリメント ステートメントで複数のループ カウンターがインクリメントされている。

    次に例を示します。

    for(i=0, j=0; i<10 && j < 10;i++, j++) {}

  • for ループのインクリメント ステートメントでループ カウンターがインクリメントされていない。

    次に例を示します。

    for(i=0; i<10;) {}

    ループ本体でループ カウンターをインクリメントしている場合でも、Polyspace® は違反を報告します。このルールは、MISRA™ C++ Rule 6-5-1 に基づくものです。MISRA C++ 仕様書によると、ループ カウンターとは、ループ式内またはループ式の前に初期化され、ループ式内の関係演算子のオペランドとして機能し、ループ式内で変更されるものであるとされています。ループ式内にインクリメント ステートメントが見つからない場合、このルール チェッカーはループ カウンターの変更を検出することができず、ループ カウンターが存在しないと見なします。

トラブルシューティング

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

すべて展開する

以下のコードは xi の両方のループ カウンターをインクリメントするため、この例は非準拠です。

#include <iostream>

int main()
{
	int x = 0;
	for (int i = 0; i >= x; i = x++)   // Non-compliant
	{
		//...
	}
}

以下の非準拠の例では、浮動小数点の計算に丸め誤差が含まれることから、for ループは 9 回しか実行されません。これは、10 回目のループで x の値が 1.0f より大きくなるためです。

#include <iostream>

int main()
{
	for (float x = 0.1f; x <= 1.0f; x += 0.1f) {   //Noncompliant
		std::cout << x << std::endl;
	}
}

チェック情報

グループ: ステートメント
カテゴリ: Required、Automated

バージョン履歴

R2019a で導入

すべて展開する