コンパイラの警告 (レベル 1) C5301 および C5302
'
#pragma omp for
': ループ条件が 'comparison' を使用している間に 'loop-index' が増加します。終了しないループ?
'
#pragma omp for
': ループ条件が 'comparison' を使用している間、'loop-index' は減少します。非終了ループ?
解説
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--)
^
*/
この問題を解決するには、テスト条件またはインデックス変更の方向を、オーバーフロー、アンダーフロー、またはその他の未定義の動作を引き起こさずに終了するものに変更します。