Udostępnij za pośrednictwem


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 forloop-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.