web-dev-qa-db-fra.com

GCC-4.9 Assainisseur de comportement non défini

Dans changements de GCC-4.9 Il dit:

Undefinedbehavioritizer (Ubsan), un détecteur de comportement non défini rapide, a été ajouté et peut être activé via -fsanitize = non défini. Divers calculs seront instrumentés pour détecter un comportement non défini au moment de l'exécution. UndefinedbehaviorSanitizer est actuellement disponible pour les langues C et C++.

J'ai examiné cette question ( ne implémentation C++ qui détecte un comportement indéfini? ) mais il semble assez obsolète.

Ce lien ( http://gcc.gnu.org/ml/gcc-patches/2013-06/msg00264.html ) a quelques informations à ce sujet, mais il a plusieurs mois.

C'est 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 de choses, pour le moment il devrait gérer la division par zéro cas, int_min/-1 et divers étuis de décalage (déplacement d'une valeur négative, déplacement lorsque le second opérande est> = que Type_Precision (First_Operand) et de ce genre. (sur des types entier, jusqu'à présent.)

D'après ce que j'ai lu, il est porté à gcc de LLVM.

Je l'ai essayé avec (5 / 0) Et la seule différence semble être cette sortie:

main.cpp:5:19: runtime error: division by zero

Quelqu'un a-t-il d'autres informations dessus ou quelles caractéristiques il a?

34
user1508519

Il s'agit davantage d'un cadre d'ajout de vérifications que d'essayer de détecter toutes les formes de comportement indéfini (ce qui est presque certainement impossible dans le sens du "problème d'arrêt").

La Documentation GCC les énumère comme les contrôles actuellement pris en charge:

-fsanitize=undefined Activez Undefinedbehavioritizer, un détecteur de comportement non défini rapide. Divers calculs seront instrumentés pour détecter un comportement non défini au moment de l'exécution. Les sous-optiques actuelles sont:

-fsanitize=shift Cette option permet de vérifier que le résultat d'une opération de décalage n'est pas indéfini. Notez que ce qui est considéré exactement considéré comme indéfini différent légèrement entre C et C++, ainsi que entre ISO C90 et C99, etc.

-fsanitize=integer-divide-by-zero Détecter la division entière par zéro ainsi que la division INT_MIN/-1.

-fsanitize=unreachable Avec cette option, le compilateur allumera l'appel __builtin_untréachable en un appel de message de diagnostic. Lorsque vous atteignez l'appel __builtin_unreachable, le comportement est indéfini.

-fsanitize=vla-bound Cette option indique au compilateur de vérifier que la taille d'une matrice de longueur variable est positive. Cette option n'a aucun effet dans le mode -ST = C++ 1Y, car la norme nécessite que l'exception soit lancée à la place.

-fsanitize=null Cette option permet la vérification du pointeur. En particulier, l'application construite avec cette option allumée émettra un message d'erreur lorsqu'il essaie de dréérence un pointeur NULL, ou si une référence (éventuellement une référence de rvalue) est liée à un pointeur NULL.

-fsanitize=return Cette option permet la vérification de la déclaration de retour. Les programmes construits avec cette option activé émettront un message d'erreur lorsque la fin d'une fonction non annulée est atteinte sans retourner une valeur. Cette option fonctionne en C++ uniquement.

-fsanitize=signed-integer-overflow Cette option permet une vérification de débordement entier signée. Nous vérifions que le résultat de +, * et à la fois unier et binaire - ne débordent pas dans les arithmétiques signés. NOTE, les règles de promotion entier doivent être prises en compte. C'est-à-dire que ce qui suit n'est pas un débordement:

signed char a = SCHAR_MAX;
a++;

Tandis que -ftrapv provoque des pièges pour que des débordements signés soient émis, -fsanitize=undefined donne un message de diagnostic. Cela ne fonctionne actuellement que pour la famille de langues C.

41
Nemo

Liste complète des options répertoriées dans ndefinedbehaviorSanitizer

Derniers ajouts GCC 5.0 extraits de série de publications GCC 5: modifications, nouvelles fonctionnalités et corrections répertoriées ci-dessous;

Undefinedbehavioritizer a gagné quelques nouvelles options d'assainissement:

-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
Gayan Pathirage