PC-Lint 8 de Gimpel Software, es una herramienta para desarrolladores en C y C++ que estáticamente analiza el código fuente en búsqueda de construcciones potencialmente peligrosas.

La empresa desarrolladora, cada mes publica un pequeño trozo de código como reto a los visitantes que intentan descubrir el error. A continuación Gimpel muestra los diagnósticos ofrecidos por su herramienta.

El siguiente código se ha obtenido del Error del mes de Diciembre de 2001.

Teniendo en cuenta el siguiente código fuente, ¿qué error se está cometiendo?

1 enum color_t { red=1, orange, green, blue };
2
3 struct car
4 {
5 float weight;
6 float length;
7 float width;
8 unsigned passengers:4;
9 unsigned convert:1;
10 unsigned pwr_brake:1;
11 unsigned pwr_steer:1;
12 enum color_t color:2;
13 };
14 struct car climacto_I;

Lanzamos PC-Lint, y esto es lo que nos reporta:

enum color_t color:2;
bug678.cpp 12 Warning 678: Member 'car::color' field length (2) too small for enum precision (3)

Ahora miramos la documentación de PC-Lint para obtener más detalles del aviso 678. Esto es lo que hay:

678 Member 'Symbol' field length (Integer) too small for enum precision (Integer) — A bit field was found to be too small to support all the values of an enumeration (that was used as the base of the bit field). For example:
enum color { red, green, yellow, blue };
struct abc { enum color c:2; };
Here, the message is not given because the four enumeration values of color will just fit within 2 bits. However, if one additional color is inserted, Warning 678 will be issued informing the programmer of the undesirable and dangerous condition.

Ahora es fácil de detectar el error, ¿verdad?

La enumeración color_t contiene 4 valores, del ordinal 1 al 4. Por ello requiere 3 bits de espacio de almacenamiento. En cambio dentro de la estructura car solo se reservan 2 bits.

Si quereis ver más errores, aquí teneis el histórico completo: http://www.gimpel.com/html/bugs.htm.

En el caso de que necesiteis una herramienta similar a PC-Lint, pero gratuita, podeis probar Splint. Bastante menos potente y eficaz, pero infinitamente más económica.