2010-01-18 15 views
6

Limpiando el antiguo código c/C++ que usaba literales enteros codificados en lugar de enumeraciones, es tedioso encontrar lugares donde la declaración de la función se haya refactorizado correctamente pero no el cuerpo. p.ej.¿Hay algún compilador c/C++ que pueda advertir (o dar error) o conversión enum a 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; 
    } 
} 

Anotación/modificar cada tipo de enumeración o buscar a través del código para ellos también sería una buena cantidad de trabajo, ya que hay muy muchas enumeraciones diferentes, así que esto no es preferido, pero podría ser una solución aceptable.

No lo necesito para estar en ninguno de nuestros compiladores principales u otras herramientas (gcc en su mayoría) o plataforma (la mayoría), ejecutarlo manualmente un par de veces sería suficiente, pero preferiría algo que no es demasiado esotérico o caro.

+0

¿No gcc maneja esto perfectamente? Estoy usando g ++ y siempre veo advertencias descritas. ¿El compilador C puro se comporta de manera diferente? – Basilevs

+0

No, compilando este código (menos ... y más un vacío main()) con: g ++ -Wall test.cpp da 0 advertencias. La promoción de int a enum está advertida, pero no a la inversa. Si trabajas de otra manera, por favor dame tu línea de comando. por favor ... –

Respuesta

1

pelusa proporcionará esta advertencia para usted (condición 641)

641 Conversión enum a int - Un tipo de enumeración se utiliza en un contexto que requiere un cálculo tales como argumento para un operador aritmético o fue en comparación con un argumento integral. Esta advertencia será suprimida si utiliza el modelo entero de enumeración (+ fie) pero perderá alguna valiosa comprobación de tipo al hacerlo. Una política intermedia es simplemente desactivar esta advertencia . La asignación de int a enum aún será capturada.

férula (http://www.splint.org/download.html) es una pelusa moderna puede utilizar

+0

sí, para la parte c más pequeña, desafortunadamente tenemos comentarios de estilo C++, por lo que los follones vomitan inmediatamente, supongo que podría eliminarlos. ¿Conoces algún OK C++ capaz o al menos ignorando la pelusa? –

1

Sparse (una herramienta de comprobación semántica utilizado por la gente del núcleo Linux) le puede ayudar con un poco de esto.

Un subconjunto de errores de enum puede ser capturado por estas opciones: -Wenum-mismatch, -Wcast-truncate. Sin embargo, ejecuté su código a través de esto y no parece que ninguno de ellos haya sido atrapado.

Este es software gratuito, en caso de que desee extenderlo.

Cuestiones relacionadas