Ostrzeżenie kompilatora (poziom 1, błąd, wyłączanie) C5262
występuje tutaj niejawny upadek; Czy brakuje instrukcji
break
? Użyj[[fallthrough]]
, gdybreak
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]]
.