Bonjour,
Dans un contexte d'analyse de code généré par un AVR/GNU C Compiler, j'ai constaté la translation de code C vers assembleur (ATMegaXXX) suivante:
Code C:
if( (!v1) || ( (v1) && ( (!v2)&&(!v3) ) ) )
QQC_à_faire;
else
Autre_Chose_à faire;
qui correspond au Code en langage naturel ==> Si (v1 faux) OU Si (v1 Vrai ET ( v2 Faux ET v3 Faux).
Ci-dessous le code machine généré par le AVR/GNU C Compiler, mixé avec les lignes de code C génératrices:
Commentaires:
=> On constate alors la duplication parfaite du premier test (!V1) : Encadrés VERT et ROUGE, duplication parfaite de code !!!!
===> La différence dans le déplacement relatif PC+0x0D (cadre vert) devenant PC+0x0A (cadre rouge) correspondant au fait que chaque cadre fait 3 @PC de long (3 mots de 16 bits), et donc les 2 instructions 'BREQ' branchent en définitive exactement sur la même @ mémoire (flèches bleues).
Comment est-possible ?
Manifestement, c'est un BUG, car si le 2ième test (V1) a disparu, ce qui est normal, la duplication du test (!V1) est tout à fait anormale: Pour preuve, il suffit de supprimer le code inclue dans n'importe quel des cadres rouge ou vert et rien n'est changé à ce que le code fait alors !!!
Je ne savais pas que le AVR/GNU C COmpiler était atteint de baiguement ?
Pour info.
-----