c++ - gcc-4.9 desinfectante de comportamiento indefinido
undefined-behavior gcc4.9 (2)
En gcc-4.9 cambios dice:
UndefinedBehaviorSanitizer (ubsan), un detector de comportamiento rápido e indefinido, se ha agregado y se puede habilitar a través de -fsanitize = undefined. Varios cómputos estarán instrumentados para detectar un comportamiento indefinido en el tiempo de ejecución. UndefinedBehaviorSanitizer está actualmente disponible para los lenguajes C y C ++.
Miré esta pregunta (¿ una implementación en C ++ que detecta un comportamiento indefinido? ) Pero parece bastante anticuada.
Este enlace ( http://gcc.gnu.org/ml/gcc-patches/2013-06/msg00264.html ) contiene información, pero tiene varios meses.
Este es un intento de agregar el desinfectante de comportamiento indefinido a GCC. Tenga en cuenta que es una versión muy alfa; hasta el momento no hace mucho, en este momento debe manejar la división por cero casos, INT_MIN / -1, y varios casos de cambio (cambiando por un valor negativo, cambiando cuando el segundo operando es> = que TYPE_PRECISION (first_operand) y suchlike. (En tipos enteros, hasta ahora.)
Por lo que he leído, está siendo portado a gcc
desde LLVM
.
Lo he intentado con (5 / 0)
y la única diferencia parece ser esta salida:
main.cpp:5:19: runtime error: division by zero
¿Alguien tiene más información o qué características tiene?
Esto es más un marco para agregar tales controles que un intento de detectar todas las formas de comportamiento indefinido (que es casi seguro imposible en el sentido de "detener el problema").
La documentación de GCC los incluye como los cheques actualmente admitidos:
-fsanitize=undefined
Habilita UndefinedBehaviorSanitizer, un detector de comportamiento rápido e indefinido. Varios cómputos estarán instrumentados para detectar un comportamiento indefinido en el tiempo de ejecución. Las subopciones actuales son:
-fsanitize=shift
Esta opción permite verificar que el resultado de una operación de cambio no esté indefinido. Tenga en cuenta que lo que se considera indefinido difiere ligeramente entre C y C ++, así como entre ISO C90 y C99, etc.
-fsanitize=integer-divide-by-zero
Detecta la división de enteros por cero así como la división INT_MIN / -1.
-fsanitize=unreachable
Con esta opción, el compilador convertirá la llamada __builtin_unreachable en una llamada de mensaje de diagnóstico. Al llegar a la llamada __builtin_unreachable, el comportamiento no está definido.
-fsanitize=vla-bound
Esta opción indica al compilador que verifique que el tamaño de una matriz de longitud variable sea positivo. Esta opción no tiene ningún efecto en el modo -std = c ++ 1y, ya que el estándar requiere que se emita la excepción en su lugar.
-fsanitize=null
Esta opción habilita la comprobación del puntero. Particularmente, la aplicación creada con esta opción activada emitirá un mensaje de error cuando intente desreferenciar un puntero NULL, o si una referencia (posiblemente una referencia de valor r) está vinculada a un puntero NULL.
-fsanitize=return
Esta opción habilita la comprobación de declaración de devolución. Los programas creados con esta opción activada emitirán un mensaje de error cuando se llegue al final de una función no nula sin devolver realmente un valor. Esta opción funciona solo en C ++.
-fsanitize=signed-integer-overflow
Esta opción habilita la comprobación de desbordamiento de entero con signo. Verificamos que el resultado de +, *, y unario y binario - no se desborde en los aritméticos firmados. Tenga en cuenta que las reglas de promoción de enteros deben tenerse en cuenta. Es decir, el siguiente no es un desbordamiento:
signed char a = SCHAR_MAX; a++;
Mientras que
-ftrapv
causa que se-ftrapv
capturas para desbordamientos firmados,-fsanitize=undefined
proporciona un mensaje de diagnóstico. Esto actualmente funciona solo para la familia C de idiomas.
Lista completa de opciones listadas en UndefinedBehaviorSanitizer
Las últimas incorporaciones de GCC 5.0 extraídas de GCC 5 Release Series: Cambios, nuevas funciones y soluciones que se detallan a continuación;
UndefinedBehaviorSanitizer ganó algunas nuevas opciones de desinfección:
-fsanitize=float-divide-by-zero: detect floating-point division by zero; -fsanitize=float-cast-overflow: check that the result of floating-point type to integer conversions do not overflow; -fsanitize=bounds: enable instrumentation of array bounds and detect out-of-bounds accesses; -fsanitize=alignment: enable alignment checking, detect various misaligned objects; -fsanitize=object-size: enable object size checking, detect various out-of-bounds accesses. -fsanitize=vptr: enable checking of C++ member function calls, member accesses and some conversions between pointers to base and derived classes, detect if the referenced object does not have the correct dynamic type.