Considérez l'énumération suivante et l'instruction switch:
typedef enum {
MaskValueUno,
MaskValueDos
} testingMask;
void myFunction(testingMask theMask) {
switch (theMask) {
case MaskValueUno: {}// deal with it
case MaskValueDos: {}// deal with it
default: {} //deal with an unexpected or uninitialized value
}
};
Je suis un programmeur Objective-C, mais je l'ai écrit en C pur pour un public plus large.
Clang / LLVM 4.1 avec -Weverything me met en garde sur la ligne par défaut:
Label par défaut dans le commutateur qui couvre toutes les valeurs d'énumération
Maintenant, je peux en quelque sorte comprendre pourquoi c'est là: dans un monde parfait, les seules valeurs entrant dans l'argument theMask
seraient dans l'énumération, aucun paramètre par défaut n'est nécessaire. Mais que se passe-t-il si un piratage arrive et jette un int non initialisé dans ma belle fonction? Ma fonction sera remplacée par une bibliothèque vide et je n’ai aucun contrôle sur ce qui pourrait y entrer. L'utilisation default
est une manière très soignée de gérer cela.
Pourquoi les dieux de la LLVM estiment-ils que ce comportement est indigne de leur appareil infernal? Devrais-je être précédé d'une instruction if pour vérifier l'argument?
-Weverything
Cela peut être utile, mais veillez à ne pas trop muter votre code pour pouvoir le gérer. Certains de ces avertissements ne sont pas seulement inutiles, ils sont contre-productifs et il vaut mieux les désactiver. (En effet, c'est le cas d'utilisation de -Weverything
: commencez par l'activer et désactivez ce qui n'a pas de sens.)
"Pro tip: Try setting the -Weverything flag and checking the “Treat Warnings as Errors” box your build settings. This turns on Hard Mode in Xcode."
.