gcc-4.9 Agent D'assainissement des comportements non défini
Dans gcc-4.9 changements il dit:
UndefinedBehaviorSanitizer (ubsan), une vitesse de comportement indéfini détecteur a été ajouté et peut être activé via-fsanitize=undefined. Différents calculs seront instrumentés pour détecter un comportement indéfini au moment de l'exécution. UndefinedBehaviorSanitizer est actuellement disponible pour Langages C et C++.
j'ai regardé cette question ( Un Une implémentation C++ qui détecte un comportement non défini? ) mais il semble assez dépassé.
ce lien ( http://gcc.gnu.org/ml/gcc-patches/2013-06/msg00264.html ) contient des informations à ce sujet, mais elles datent de plusieurs mois.
il s'agit d'une tentative d'ajouter le désinfectant de comportement non défini à GCC. Notez que c'est une version très alpha; jusqu'à présent, cela ne fait pas beaucoup, à le moment il devrait traiter la division par zéro cas, INT_MIN / -1, et différents cas de changement (déplacement par une valeur négative, déplacement la deuxième opération est > = que TYPE_PRECISION (first_operand) et ainsi de suite. (Sur les types entiers, jusqu'à présent.)
D'après ce que j'ai lu, il est porté à gcc
de LLVM
.
j'ai essayé avec (5 / 0)
et la seule différence semble être cette sortie:
main.cpp:5:19: runtime error: division by zero
est-ce que quelqu'un a encore informations ou caractéristiques?
2 réponses
il s'agit plus d'un cadre pour ajouter de tels contrôles qu'une tentative de détecter toutes les formes de comportement non défini (ce qui est presque certainement impossible dans le sens de" problème d'arrêt").
la documentation GCC liste ceux - ci comme les contrôles actuellement pris en charge:
-fsanitize=undefined
Activez UndefinedBehaviorSanitizer, un détecteur de comportement rapide et non défini. Différents calculs seront instrumentés de détecter un comportement non défini à l'exécution. Les sous-positions actuelles sont:
-fsanitize=shift
cette option permet de vérifier que le résultat d'une opération de changement n'est pas indéfini. Notez que ce qui est considéré comme Non défini diffère légèrement entre C et c++, ainsi qu'entre ISO C90 et C99, etc.
-fsanitize=integer-divide-by-zero
détecte la division entière par zéro ainsi que la division INT_MIN / -1.
-fsanitize=unreachable
avec ce option, le compilateur transformera l'appel_ _ builtin _ unreachable en un appel de message de diagnostic à la place. En atteignant l'appel_ _ builtin _ unreachable, le comportement est indéterminé.
-fsanitize=vla-bound
cette option Demande au compilateur de vérifier que la taille d'un tableau de longueur variable est positive. Cette option n'est pas ont tout effet en mode-std=c++1y, car la norme exige l'exception doit être jetée à la place.
-fsanitize=null
This option permet de vérifier le pointeur. En particulier, l'application construite avec cette option activée émettra une erreur message quand il essaie de déréférencer un pointeur NULL, ou si une référence (éventuellement une référence rvalue) est lié à un pointeur NULL.
-fsanitize=return
cette option permet la vérification des déclarations de retour. Les programmes construits avec cette option activée émettront un message d'erreur lorsque la fin d'une fonction non vide est atteinte sans réellement de retour d'un valeur. Cette option fonctionne en C++.
-fsanitize=signed-integer-overflow
cette option permet le contrôle de débordement d'entier signé. Nous vérifions que le résultat de +, *, et les deux unaire et binaire-ne déborde pas dans l'arithmétique signée. Note, les règles de promotion des entiers doivent être prises en compte. Qui est, le ce qui suit n'est pas un débordement:signed char a = SCHAR_MAX; a++;
alors que
-ftrapv
provoque l'émission de pièges pour les débordements signés,-fsanitize=undefined
donne une message de diagnostic. Ce ne fonctionne actuellement que pour la famille C des langues.
liste Complète des options répertoriées dans UndefinedBehaviorSanitizer
derniers ajouts GCC 5.0 extraits de la série de Versions GCC 5: modifications , nouveautés et corrections énumérées ci-dessous;
UndefinedBehaviorSanitizer a gagné quelques nouvelles options de désinfection:
-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.