Udostępnij za pośrednictwem


Ostrzeżenie kompilatora (poziom 1, błąd, wyłączanie) C5262

występuje tutaj niejawny upadek; Czy brakuje instrukcji break ? Użyj [[fallthrough]] , gdy break instrukcja jest celowo pomijana między przypadkami

Uwagi

Przepływ sterowania, który niejawnie mieści się między przypadkami instrukcji przełącznika, jest historycznym źródłem usterek zarówno dla języka C, jak i C++. Chociaż mieliśmy __fallthrough makro SAL, nie było przydatne w diagnostyce kompilatora kompilacji. Ponieważ klienci mają starszy kod, który "przechodzi" celowo, nie jest opłacalne, aby dać ostrzeżenie z możliwością działania bez wskazywania zamierzonego upadku. W języku C++17 dodano atrybut w [[fallthrough]] celu wskazania takiego wystąpienia. Kompilator może uwzględnić ten atrybut i pominąć nowe ostrzeżenie.

Ostrzeżenie kompilatora C5262 jest nowe w programie Visual Studio 2022 w wersji 17.4 i jest domyślnie wyłączone i traktowane jako błąd domyślnie po włączeniu. Aby nadal obsługiwać starszy kod bez przerw kompilacji, należy jawnie włączyć język C5262. Aby uzyskać więcej informacji na temat włączania tego ostrzeżenia, zobacz Ostrzeżenia kompilatora, które są domyślnie wyłączone.

Przykład

Przykładowy kod przedstawia diagnostykę przypadków switch , które przechodzą bez break instrukcji lub return lub atrybutu [[fallthrough]] .

// C5262.cpp
// compile using /std:c++17 /we5262

int main(int argc, char** argv)
{
    switch (argc)
    {
        case 0: ++argv;
        case 1:
        case 2: argv++;
        default:
            argv = 0;
    }
}

/*
When built, the compiler produces this output:

.\C5262.cpp(9,9): error C5262: implicit fall-through occurs here; are you missing a break statement? Use [[fallthrough]] when a break statement is intentionally omitted between cases
        case 1:
        ^
.\C5262.cpp(8,17): note: statement that may fall through is here
        case 0: ++argv;
                ^
.\C5262.cpp(11,9): error C5262: implicit fall-through occurs here; are you missing a break statement? Use [[fallthrough]] when a break statement is intentionally omitted between cases
        default:
        ^
.\C5262.cpp(10,17): note: statement that may fall through is here
        case 2: argv++;
*/

Aby rozwiązać ten problem, gdy przepływ sterowania między przypadkami jest zamierzony, użyj atrybutu [[fallthrough]] .

Zobacz też

switch instrukcja (C++)
[[fallthrough]] Atrybut