Partager via


Avertissement du compilateur (niveau 1, erreur, désactivé) C5262

la chute implicite se produit ici ; vous manquez une break déclaration ? Utiliser [[fallthrough]] lorsqu’une break 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]] .

Voir aussi

Instruction switch (C++)
[[fallthrough]], attribut