Avertissement du compilateur (niveau 1, erreur, désactivé) C5262
la chute implicite se produit ici ; vous manquez une
break
déclaration ? Utiliser[[fallthrough]]
lorsqu’unebreak
instruction est intentionnellement omise entre les cas
Notes
Le flux de contrôle qui se situe implicitement entre les cas d’instructions switch est une source historique de bogues pour C et C++. Bien que nous disposions de la __fallthrough
macro SAL, il n’était pas utile pour les diagnostics du compilateur de build. Étant donné que les clients disposent d’un code hérité qui « tombe à travers » à des fins, il n’est pas viable de donner un avertissement actionnable sans aucune façon d’indiquer une chute intentionnelle. En C++17, l’attribut [[fallthrough]]
a été ajouté pour indiquer une telle instance. Le compilateur peut prendre en compte cet attribut et supprimer le nouvel avertissement.
L’avertissement du compilateur C5262 est nouveau dans Visual Studio 2022 version 17.4 et est désactivé par défaut et traité comme une erreur par défaut lorsqu’il est activé. Pour continuer à prendre en charge le code hérité sans interruption de build, C5262 doit être explicitement activé. Pour plus d’informations sur l’activation de cet avertissement, consultez les avertissements du compilateur désactivés par défaut.
Exemple
L’exemple de code montre les diagnostics pour switch
les cas qui se trouvent sans ou sans break
instructions ou return
l’attribut [[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++;
*/
Pour résoudre ce problème lorsque le flux de contrôle entre les cas est intentionnel, utilisez l’attribut [[fallthrough]]
.