De nouvelles vérifications d'énumération dans Visual Studio 2022 version 17.2 Preview 3

Par:
fredericmazue

mer, 13/04/2022 - 10:00

En ce qui concerne la programmation C++, Microsoft a introduit dans Visual Studio 2022 version 17.2 Preview 3 trois nouvelles vérifications à son outil d'analyse statique C++ pour détecter une mauvaise utilisation potentielle des énumérations avec des opérations au niveau du bit. Ces vérifications ont été inspirées par de vrais bugs trouvés dans du code de production. Microsoft a également ajouté une vérification qui suggère d'utiliser l'instruction enum à portée de C++11 au lieu de son homologue hérité.

Par exemple, certaines énumérations contiennent des valeurs qui sont des puissances de deux. La plupart de ces types d'énumérations sont des drapeaux utilisés pour représenter des états non exclusifs qui peuvent être combinés et interrogés à l'aide d'opérations au niveau du bit. Les nouveaux contrôles tentent de détecter les mauvaises utilisations de ces énumérations. 

Un autre de ces contrôles peut aider à détecter les constantes d'énumérateur dans les énumérations au niveau du bit quand il a été oublié d'ajouter un initialiseur. Par exemple :

enum class AlmostBitWise
{
    A = 1,
    B = 2,
    C = 4,
    D
};

int almostBitwiseEnums(AlmostBitWise a)
{
    return (int)a|(int)AlmostBitWise::A; // Warning C26827: Did you forget to initialize an enum, or intend to use another type?
}

Autre exemple, les expressions au niveau du bit où les valeurs de différentes énumérations sont mélangées sont signalées :

enum BitWiseA
{
    A = 1,
    B = 2,
    C = 4
};

enum class BitWiseB
{
    AA = 1,
    BB = 2,
    CC = 4,
    All = 7
};

int overlappingBitwiseEnums(BitWiseA a)
{
    return (int)a|(int)BitWiseB::AA; // Warning C26828: Different enum types have overlapping values. Did you want to use another enum constant here?

L'activation de l'analyse statique C++ dans Visual Studio 2022 est documentée ici