次の方法で共有


コンパイラの警告 (レベル 1) C5301 および C5302

'#pragma omp for': 'loop-index' は増加しますが、ループ条件では 'comparison' を使用します。終了しないループですか?

'#pragma omp for': 'loop-index' は減少しますが、ループ条件では 'comparison' を使用します。終了しないループですか?

解説

OpenMP 3.1 のサポートの強化に加えて、開発者エクスペリエンスを向上させるために、C5301 と C5302 の 2 つの診断が追加されました。 これらの診断では、ループ インデックス変数が増減しているかどうかに基づいて、 omp parallel for のループ条件が正しいことを確認します。 これらのチェックは、整数インデックスとポインター インデックスの両方で機能します。

これらのコンパイラ警告は、Visual Studio 2022 バージョン 17.4 の新機能です。

サンプル コードは、インデックスをデクリメントする for ループの診断を示していますが、インデックスが開始値より大きい値より小さいかどうかをテストする <= 比較を使用します。

// C5302.c
// compile using /openmp

#include <stdio.h>

int main()
{
    int a[100], i;
    int k = 1;
    #pragma omp parallel for
    for (i = 0; i <= 100; i--)
        a[i] = i*i;
}

/*
Compiler warning message:

.\C5302.c(11,19): warning C5302: '#pragma omp for': 'i' decreases while loop condition uses '<='; non-terminating loop?
    for (i = 0; i <= 100; i--)
                  ^
*/

この問題を解決するには、テスト条件またはインデックス変更の方向を、オーバーフロー、アンダーフロー、またはその他の未定義の動作を引き起こさずに終了するものに変更します。