Ostrzeżenia kompilatora (poziom 1) C5301 i C5302
'
#pragma omp for
': 'loop-index' zwiększa się, podczas gdy warunek pętli używa 'comparison'; non-terminating loop?
'': '
#pragma omp for
loop-index' zmniejsza się, podczas gdy warunek pętli używa 'porównania'; pętla niezwiązana z kończeniem?
Uwagi
Wraz z ulepszoną obsługą protokołu OpenMP 3.1 dodaliśmy dwie diagnostyki C5301 i C5302, aby ulepszyć środowisko deweloperskie. Te diagnostyki sprawdzają, czy warunki pętli dla omp parallel for
elementu są poprawne, na podstawie tego, czy zmienna indeksu pętli rośnie, czy zmniejsza. Te kontrole działają zarówno dla indeksów całkowitych, jak i wskaźników.
Te ostrzeżenia kompilatora są nowe w programie Visual Studio 2022 w wersji 17.4.
Przykład
Przykładowy kod przedstawia diagnostykę for
pętli, która dekrementuje indeks, ale używa <=
porównania, które sprawdza, czy indeks jest mniejszy niż wartość wyższa niż wartość początkowa.
// 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--)
^
*/
Aby rozwiązać ten problem, zmień warunek testu lub kierunek zmiany indeksu na taki, który kończy się bez powodowania przepełnienia, przepełnienia lub innego niezdefiniowanego zachowania.