2010-01-18 7 views
6

Nettoyage de l'ancien code c/C++ qui utilisait des littéraux entiers codés en dur au lieu d'enums, il est fastidieux de trouver des endroits où la déclaration de fonction a été correctement refactorisée mais pas le corps. par exemple.Y at-il un compilateur c/C++ qui peut avertir (ou donner une erreur) ou une conversion enum en int?

enum important { 
    little = 1, 
    abit = 2, 
    much = 3 
}; 

void blah(int e) 
{ 
    // magic stuff here 
} 

void boing(int e) { ... } 

void guck(important e) 
{ 
    switch (e) { 
    case 3: // this would be a good place for a warning 
     blah(e); // and this 
     break; 
    default: 
     boing((int)e); // but this is OK (although imperfect and a warning would be acceptable) 
     break; 
    } 
} 

Annoter/modifier chaque type de ENUM ou à la recherche par le code pour eux serait également une bonne quantité de travail car il y a très très nombreux énumérations différentes, donc ce n'est pas préféré, mais pourrait être une solution acceptable. Je n'ai pas besoin d'être dans l'un de nos principaux compilateurs ou d'autres outils (gcc surtout) ou plate-forme (la plupart), le faire fonctionner manuellement quelques fois serait suffisant, mais je préférerais quelque chose qui n'est pas trop ésotérique ou cher.

+0

Est-ce que gcc ne gère pas cela parfaitement? J'utilise g ++ et je vois toujours les avertissements décrits. Est-ce que le compilateur C pur se comporte différemment? – Basilevs

+0

Non, compiler ce code (moins ... et plus vide principal()) avec: g ++ -Wall test.cpp donne 0 avertissements. La promotion d'int à enum est mise en garde, mais pas l'inverse. Si vous avez l'autre façon de travailler, donnez-moi votre ligne de commande. S'il vous plaît ... –

Répondre

1

peluches fournira cet avertissement pour vous (condition 641)

641 Conversion ENUM int - Un type d'énumération a été utilisé dans un contexte nécessaire un calcul comme un argument à un opérateur arithmétique ou était par rapport à un argument intégral. Cet avertissement sera supprimé si vous utilisez le modèle entier de l'énumération (+ fie), mais vous perdrez quelques précieuses vérifications de type en le faisant. Une politique intermédiaire consiste simplement à désactiver cet avertissement . L'affectation de int à enum sera toujours capturée.

Splint (http://www.splint.org/download.html) est une fibre moderne, vous pouvez utiliser

+0

oui, pour la plus petite partie c, malheureusement, nous avons des commentaires de style C++ alors éclaboussures immédiatement, je suppose que je pourrais sed ceux loin. Vous savez de tout OK C++ capable ou à bail ignorant peluche? –

1

Sparse (un outil de vérification sémantique utilisé par le peuple du noyau Linux) peut vous aider avec une partie de cela.

Un sous-ensemble d'erreurs enum peut être détecté par ces options: -Wenum-mismatch, -Wcast-truncate. Cependant, j'ai couru votre code à travers cela et ne semble pas l'un de ceux qui ont été capturés.

Ceci est un logiciel libre, si vous voulez l'étendre.