2008-11-21 12 views
9

A continuación se muestra un código obviamente defectuoso para el cual creo que el compilador debería emitir un diagnóstico. Pero ni gcc ni g++ hace, incluso con todas las opciones de advertencias que se me ocurrieron: -pedantic -Wall -Wextra¿Puedo hacer que GCC advierta sobre el paso de tipos demasiado amplios a las funciones?

#include <stdio.h> 

short f(short x) 
{ 
    return x; 
} 

int main() 
{ 
    long x = 0x10000007; /* bigger than short */ 
    printf("%d\n", f(x)); /* hoping for a warning here */ 
    return 0; 
} 

¿Hay una manera de hacer gcc y g++ advierten sobre esto? En una nota lateral, ¿tiene otro compilador que advierta sobre esto de manera predeterminada o en una configuración de advertencias extra bastante común?

Nota: Estoy usando GCC (compiladores C y C++) versión 4.2.4.

Edit: acaba de encontrar que gcc -Wconversion hace el truco, pero la misma opción de g++ no lo hace, y realmente estoy usando C++ aquí, así que necesitan una solución para g++ (y ahora pregunto por qué -Wconversion doesn' parece ser eso).

Editar: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34389 sugiere que esto se puede solucionar en g++ 4.4 ... ¿tal vez? Aún no me queda claro si es el mismo problema o si la solución realmente viene en esa versión. Tal vez alguien con 4.3 o 4.4 pueda probar mi caso de prueba.

Respuesta

6

Uso -Wconversion - el problema es una conversión implícita (conversión) de largo x a corto cuando la función f (corto x) se llama [no printf], y -Wconversion dirá algo así como "lanzar de largo a corto puede alterar el valor".

..

Editar: acaba de ver su nota. -Wconversion resulta en una advertencia para mí, usando g ++ 4.3.2 en Linux ... (4.3.2-1 en Debian)

+0

Aha - entonces es solo que 4.2.4 es demasiado "viejo" para advertirlo como debería, y 4.3.2 funciona (estoy haciendo un par de suposiciones aquí, pero creo que es seguro decirlo porque estoy usando Ubuntu y vi algunas notas sobre el tema que hacen que parezca razonable pensar que esto es algo arreglado en 4.3+. –

+0

Ahora he intentado con GCC 4.3.2 en una máquina Ubuntu Intrepid, y -Wconversion hace lo que quiero. Hooray. Pero boo para 4.2.4 no funciona. –

+0

falta una mención de -Wsign -conversión para g ++ (necesario al menos en versiones más nuevas) ... – codeling

0

Recomiendo encarecidamente invertir en PC-lint/FlexeLint de Gimpel. El software está hecho para atrapar cosas como esta que el compilador simplemente no es. Es relativamente barato y vale la pena el precio. Hay una demostración en línea en el sitio que se puede utilizar para evaluar, aquí es lo que informa de la línea en cuestión de su ejemplo:

diy.cpp 14 Info 734: Loss of precision (arg. no. 1) (31 bits to 15 bits) 
Cuestiones relacionadas