7
votes

Pourquoi GCC ne donne-t-il pas un avertissement au comportement indéfini dans le code à l'intérieur?

Je viens de lire Ceci SO C ++ FAQ sur les points de comportement et de séquence non définis et expérimenté un peu. Dans le code suivant GCC-4.5.2 me donne un avertissement uniquement dans la ligne mentionnée dans le commentaire du code, bien que la ligne d'une ligne avant affiche également un comportement indéfini, n'est-ce pas? Vous ne pouvez pas dire quel opérand d'addition est exécuté en premier (comme + n'est pas un point de séquence). Pourquoi GCC ne me donne-t-il pas un avertissement dans cette ligne aussi? XXX

Merci d'avoir aidé.


2 commentaires

Considérez que dans de nombreux cas, FOO pourrait être défini dans un autre fichier source, il n'ya donc aucun moyen pour le compilateur de détecter cela. Ou l'accès peut être caché derrière un ensemble complexe de déréférences de pointeur. Le compilateur ne peut pas détecter tous les cas possibles de comportement indéfini.


Il existe également des points de séquence avant que les corps des fonctions ne soient entrés et juste avant de rester également.


3 Réponses :


17
votes

Le comportement de i = i + foo (); n'est pas spécifié mais pas indéfini. Undefined signifie tout comportement possible est autorisé, même d'abandonner le programme. Non spécifié signifie soit i est évalué en premier, soit FOO (). Oui, FOO écrit à cette même chose, mais comme cela se produit dans une déclaration distincte, il y a un point de séquence avant et après ce magasin.


1 commentaires

Abandonner le programme serait positivement bénigne par rapport à un traitement des compilateurs hyper-modernes du comportement non défini. La norme indique qu'une fois qu'un programme a reçu une contribution qui ferait un comportement indéfini inévitable, le compilateur peut générer le comportement le plus perpétuel imaginable sans violer la norme; La philosophie de compilateur hyper-moderne encourage les compilateurs à exploiter cette liberté au maximum.



-6
votes

Il est visible pour les humains qui appelant FOO () modifieraient i, mais pour un programme informatique, il est difficile de voir. Il n'est tout simplement pas conçu pour voir cela.


0 commentaires

2
votes

La ligne i = i + foo (); dans votre programme n'est pas spécifié mais non indéfini.

compilateurs Essayez d'émettre des avertissements sans fausses positifs (chaque fois que le compilateur avertissez, il existe un défaut que le programmateur devrait corriger), ou du moins avec des taux très bas de faux positifs. Cela signifie qu'en échange, ils ont assez de faux négatifs. Conformément à la même philosophie, les compilateurs ne mettent généralement pas avertir les comportements non spécifiés.

Pour obtenir un avertissement sur votre programme, vous devez rechercher des analyseurs statiques, qui sont plus agressifs pour les avertissements, au coût de légèrement plus faux positifs. Les analyseurs statiques peuvent très bien décider d'avertir des comportements non spécifiés. Certains d'entre eux avertissent même des comportements définis qui, bien que définis, indiquent que le programmeur était probablement confus.


0 commentaires