メインコンテンツ

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

CERT C: Rule FLP30-C

浮動小数点変数をループ カウンターとして使用しない

説明

ルール定義

浮動小数点変数をループ カウンターとして使用しないようにします。1

Polyspace 実装

ルール チェッカーは、"float 型数をループ カウンターとして使用" をチェックします。

すべて展開する

問題

この問題は、ループ カウンターが浮動小数点型の場合に発生します。

for インデックスが変数シンボルである場合に、Polyspace® はそれが浮動小数点ではないことをチェックします。

リスク

浮動小数点ループ カウンターを使用すると、丸め誤差の累積により反復回数の期待値と実際の回数が一致しなくなる可能性があります。この丸め誤差は、浮動小数点の基数のべき乗ではないループ ステップを浮動小数点で表現される値に丸める場合に発生します。

浮動小数点ループ カウンターを含むループが、ある実装では正常に動作しているようでも別の実装では異なる反復回数を示す可能性があります。

例 - for ループ カウンター

この例では、3 つの for ループで 3 つの異なるループ カウンターが示されています。1 番目と 2 番目の for ループは浮動小数点型変数をループ カウンターとして使用しているため準拠しません。3 番目のループは整数 count をループ カウンターとして使用しています。count がループ内で浮動小数点として使用されていても、ループ インデックスとして動作する場合は変数は整数のままです。したがって、この for ループは準拠しています。

int main(void){
    unsigned int counter = 0u;
    int result = 0;
    float foo;

    // Float loop counters
    for(float foo = 0.0f; foo < 1.0f; foo +=0.001f){ /*Non-compliant*/
        /*counter = 1000 at the end of the loop */
        ++counter;
    }

    float fff = 0.0f; 
    for(fff = 0.0f; fff <12.0f; fff += 1.0f){    /* Non-compliant*/
        result++;
    }

    // Integer loop count
    for(unsigned int count = 0u; count < 1000u; ++count){ /* Compliant */
        foo = (float) count * 0.001f;
    }
}
while ループ カウンター

この例では、2 つの while ループを示しており、両方が while ループ条件内で浮動小数点変数を使用しています。

  • 1 番目の while ループは条件内とループ内で浮動小数点変数 foo を使用しています。foo は変化するため、浮動小数点の丸め誤差が予期しない動作を引き起こす可能性があります。Polyspace は違反を報告します。

  • 2 番目の while ループでは、ループ条件内で浮動小数点配列 buffer が使用されます。Polyspace は iter1iter2 をループ変数として特定します。ループ変数は浮動小数点変数ではないので、違反は報告されません。

int main(void){
    unsigned int iter1 =0;
    int iter2;
    float foo;
    double buffer[2];
    double tmp;

    foo = 0.0f;
    while (foo < 1.0f){/* Non-compliant - foo used as a loop counter */
        foo += 0.001f;  
    }
       
	//...
    while((iter1+1 < 2)&& (buffer[iter1]<buffer[iter2])){ //Compliant - loop counter is integer
		// swap buffer[iter1] and buffer[iter2]
        tmp = buffer[iter2];
        buffer[iter2] = buffer[iter1];
        buffer[iter1] = tmp;
        iter2 = iter1;
        iter1++;
    }
						
    return 1; 
}

チェック情報

グループ: Rule 05.浮動小数点 (FLP)

バージョン履歴

R2019a で導入

すべて展開する


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.