Pregunta gcc-4.9 desinfectante de comportamiento indefinido


En gcc-4.9 cambios dice:

UndefinedBehaviorSanitizer (ubsan), un comportamiento rápido e indefinido   detector, se ha agregado y se puede habilitar a través de -fsanitize = undefined.   Varios cómputos serán instrumentados para detectar un comportamiento indefinido   en tiempo de ejecución. UndefinedBehaviorSanitizer está actualmente disponible para   C y C ++.

Miré esta pregunta (¿Una implementación en C ++ que detecta un comportamiento indefinido?) pero parece bastante anticuado.

Este enlace (http://gcc.gnu.org/ml/gcc-patches/2013-06/msg00264.html) tiene algo de 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 ahora no hace tanto, en   el momento en que debería 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 similares.   (En tipos enteros, hasta ahora)

Por lo que he leído, está siendo portado a gcc de 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?


32
2017-12-23 06:38


origen


Respuestas:


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").

los Documentación de GCC los enumera como los controles actualmente admitidos:

-fsanitize=undefined   Habilita UndefinedBehaviorSanitizer, un detector de comportamiento rápido e indefinido. Varios cómputos serán instrumentados   para detectar el 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 exactamente   indefinido difiere ligeramente entre C y C ++, así como entre ISO   C90 y C99, etc.

-fsanitize=integer-divide-by-zero Detecta la división entera 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 es   indefinido

-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 algún efecto en el modo -std = c ++ 1y, ya que el estándar requiere   excepción se arrojará en su lugar.

-fsanitize=null Esta opción habilita la comprobación del puntero. En particular, la aplicación creada con esta opción activada emitirá un error   mensaje cuando intenta desreferenciar un puntero NULL, o si es una referencia   (posiblemente una referencia rvalue) 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 alcanza el final de una función no nula sin realmente   devolviendo un valor Esta opción funciona solo en C ++.

-fsanitize=signed-integer-overflowEsta opción habilita la verificación de desbordamiento de entero con signo. Comprobamos que el resultado de +, * y ambos unarios   y binario - no se desborda en las aritméticas firmadas. Nota,   las reglas de promoción de enteros deben tenerse en cuenta. Eso es el   El siguiente no es un desbordamiento:

signed char a = SCHAR_MAX;
a++;

Mientras -ftrapv causa que se emitan trampas para desbordamientos firmados, -fsanitize=undefined da un mensaje de diagnóstico. Esta   actualmente funciona solo para la familia C de idiomas.


40
2017-12-23 07:13



Lista completa de opciones listadas en UndefinedBehaviorSanitizer

Últimas adiciones de GCC 5.0 extraídas de GCC 5 Release Series: Cambios, nuevas funciones y soluciones listado 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.

1
2018-03-28 07:07