2010-11-29 17 views
10

A menudo se hacen suposiciones sobre una plataforma en particular en la que se está codificando, por ejemplo, que los enteros con signo utilizan el complemento de almacenamiento en dos, o que (0xFFFFFFFF == -1), o cosas de esa naturaleza.¿Hay alguna herramienta para C++ que compruebe el comportamiento común no especificado?

¿Existe una herramienta que pueda verificar una base de código para las violaciones más comunes de este tipo de cosas (para aquellos de nosotros que queremos un código portable pero no tenemos máquinas extrañas que no sean dos)?

(Mis ejemplos anteriores son específicos de enteros con signo, pero estoy interesado en otros errores (como la alineación o el orden de bytes) así)

+1

Solo un punto de terminología: las cosas de las que habla están definidas por la implementación, no están definidas.Alineación, orden de bytes, representación de entero con signo ... todos estos aspectos están definidos por la implementación y especificados como tales dentro del estándar. –

+0

@up, cierto. Sin embargo, el OP menciona 'no especificado' no 'indefinido', que aparentemente es diferente. No estoy seguro de cuál es aplicable aquí. - http://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior – Kos

+0

@Noah Roberts: Ver '1.3.25': ** comportamiento no especificado ** comportamiento, por un bien formado programa construir y corregir los datos, que depende de la implementación (al menos de acuerdo con el C++ 0x FCD) –

Respuesta

4

Hay varios niveles de advertencias del compilador que es posible que deseen tener encendido, y puede tratar las advertencias como errores.

Si hay otras suposiciones que sabe que hace en varios puntos del código, puede afirmarlas. Si puede hacer eso con afirmaciones estáticas, obtendrá un error en tiempo de compilación.

+1

Bueno, esto es por supuesto cierto. Tal vez haya un cambio de GCC que me falta, pero no advierte sobre este tipo de cosas. (MSVC tampoco) –

2

Pregunta muy interesante. Creo que sería todo un reto para escribir una herramienta para marcar estos de manera útil, ya que gran parte depende de la intención/supuestos del programador

Por ejemplo, sería fácil de reconocer una construcción como:

x &= -2; // round down to an even number 

como dependiente de la representación de complemento a dos, pero ¿y si la máscara es una variable en lugar de una constante "-2"?

Sí, podría dar un paso más y advertir de cualquier uso de un int firmado con & bit, cualquier asignación de una constante negativa a un int sin firmar, y cualquier asignación de un int firmado a un int sin signo, etc. ., pero creo que eso generaría muchísimos falsos positivos.

[lo siento, no es realmente una respuesta, pero demasiado largo para un comentario]

+0

Bueno, por supuesto, ninguna herramienta de este tipo podría ser perfecta, pero creo que la gran mayoría de esas cosas serían más fácilmente reconocibles. (Nota al margen: archiva el algoritmo del número par hasta el final ... nunca lo había visto antes) –

3

Tal vez una herramienta de análisis de código estático? Usé uno hace unos años e informó errores como este. No era perfecto y aún limitado, pero tal vez las herramientas son mejores ahora?

actualización: Tal vez uno de estos: What open source C++ static analysis tools are available?

update2: Probé FlexeLint en su ejemplo (se puede probar en línea con el Do-it-yourself Ejemplo de http://www.gimpel-online.com/OnlineTesting.html) y se queja de ello, pero tal vez no en una forma que busca:

5 int i = -1; 
6 if (i == 0xffffffff) 
diy64.cpp 6 Warning 650: Constant '4294967295' out of range for operator '==' 
diy64.cpp 6 Info 737: Loss of sign in promotion from int to unsigned int 
diy64.cpp 6 Info 774: Boolean within 'if' always evaluates to False [Reference: file diy64.cpp: lines 5, 6] 
+0

Bien ... ejemplos? = 1 –

+0

Sí ... ejemplos ... En realidad, no recuerdo cómo se llamó, creo que fue Coverity. Todo lo que sé es que era una herramienta comercial y cuesta mucho ... – rve

+0

podría ser tapado en ese momento: p De hecho, la salida de FlexeLint es bastante interesante, 'Pérdida de señal 'es una pista falsa. –

4

sé que está muy cLANG desarrollando activamente un analizador estático (como una biblioteca).

El objetivo es detectar errores en el tiempo de análisis, sin embargo, la magnitud exacta de los errores detectados todavía no me resulta tan clara. La biblioteca se llama "Checker" y T. Kremenek es la responsable, puede consultarla en la lista de distribución de clang-dev.

No tengo la impresión de que haya algún tipo de referencia sobre las comprobaciones que se están realizando, y no creo que todavía esté lo suficientemente maduro para la herramienta de producción (dada la tasa de cambios), pero puede ser digno de una mirada.

Cuestiones relacionadas