2010-08-25 24 views
3

Une fois de plus, nos questions les plus appréciées "i = i--". En C99, nous avons:Existe-t-il une documentation spécifique pour le comportement de "i = i--" dans gcc?

6.5 Expressions # 2: Entre le précédent et suivant le point de séquence d'un objet aura sa valeur stockée modifiée au plus une fois

70) Ce paragraphe rend !! indéfini!! expressions déclaration tels que

i = ++i + 1; 

Mais pour le comportement undefinded il peut y avoir des variantes de sortie aléatoire pour "l'exécution du programme d'une manière documentée" (c99 3.4.3)

Ainsi, la question:

Est-ce que gcc documente le comportement pour les instructions i = i ++, i = i--, etc.

code actuel est

int main(){int i=2;i=i--;return i;} 
+4

Non, gcc ne documente pas ce qu'il fait dans ce cas. Les implémenteurs de Gcc recherchent, entre autres, la rapidité du code généré. Documenter ce que cet exemple fait irait à l'encontre de cet objectif. Faire des programmeurs qui écrivent du code comme celui-ci heureux n'a aucun poids comparé à l'amélioration des résultats des tests. –

Répondre

5

GCC ne documente pas ce comportement. Le Warning Options page mentionne des problèmes de points de séquence dans -Wsequence-point, mais ne fait pas allusion aux sémantiques bien définies pour les violations.

GCC a une bonne liste de C Implementation Defined Behaviour, mais je n'ai pas trouvé de référence à ce problème ici non plus.

+0

Je ne sais pas comment c'est maintenant, mais dans les gens GCC passé autant que possible étaient ouvertement pro-standard. IOW, si la norme dit qu'elle est indéfinie ou non spécifiée, c'est donc dans GCC. – Dummy00001

1

Il est laissé à la mise en œuvre de back-end pour décider ce qu'il fait. Vous pouvez utiliser -S et inspecter le code généré pour déterminer la séquence exacte des événements.

+0

Y a-t-il un document sur de tels cas? – osgx

+0

et quel est le backend dans GCC? Sera-t-il différent pour x86 et sparc, par exemple? – osgx

+1

Comportement indéfini signifie que tout est juste jeu. Le compilateur pourrait choisir de générer du code différent à différents jours de la semaine. – jamesdlin

1

Ce n'est pas documenté mais même si c'était le cas, je ne voudrais pas le lire. Vous ne devez jamais vous fier à ce qu'une implémentation particulière fait lorsqu'elle s'exécute dans un comportement indéfini.

+1

Si cela va être documenté, je peux compter, que GCC avec certaines versions le fera, ce qui a été documenté. Oui, mon code sera erroné pour tout autre compilateur, mais pas pour GCC. – osgx

+0

@osgx: Peut-être que vous pourriez mais je pense que cela va causer beaucoup plus de problèmes que ça en vaut la peine. Il est, par exemple, très déroutant pour les personnes lisant votre code. Et pourquoi voudriez-vous faire quelque chose comme 'i = i -' de toute façon? Vous devriez savoir ce que vous voulez faire alors pourquoi ne pas l'épeler en C++? – Job

+0

ce cas nous est venu de notre grand ensemble de test, partiellement écrit par nos testeurs. Ils ont «très» différents niveaux de compétences en langage C. – osgx

0

pourquoi diable voudriez-vous faire cela? Sérieusement. Je suis curieux.

+0

Ce code se trouve dans l'ensemble de test du compilateur. Cet ensemble de test fonctionne bien pour ** certaines ** versions de gcc. – osgx

+0

C'est un comportement non défini, donc tout comportement est valide. Si votre "test de compilation" renvoie * non valide * pour tout compilateur, alors votre test est cassé, car il devrait toujours retourner * valide *, peu importe si le résultat est 2, 3, 4 ou la fin de l'univers tel que nous le connaissons . Nous pouvons choisir si un comportement indéfini a toujours des résultats valides ou toujours invalides, bien sûr. ;) – Secure

+0

BTW, avez-vous testé que les résultats sont cohérents à travers différents niveaux d'optimisation? – Secure