2010-11-22 6 views
2

Mon programme présente un comportement étrange lorsque je le passe dans le débogueur. Dans l'extrait suivant, il vérifie pktNum != ~invPktNum puis procède directement à la seconde instruction return 1;. Le débogueur montre que pktNum est un caractère non signé 0x01 et invPktNum est un caractère non signé 0xFE.Pourquoi une partie de mon code est-elle ignorée?

/* Verify message integrity. */ 
if (pktNum != ~invPktNum) { 
    return 1; 
} 
ccrc = crc16_ccitt(msg, XModem_Block_Size); 
if ((((ccrc>>8) & 0xFF) != crcBuf[0]) 
    || ((ccrc & 0xFF) != crcBuf[1])) { 
    return 1; 
} 
+1

'! InvPktNum' est' 0'. –

+0

OH MON DIEU! Il a fait exactement ce que vous lui avez dit - il a testé que 0x1! = 0, et a renvoyé 1. Arrêtez les presses! –

+0

Désolé, je voulais dire '~'. Je l'ai changé pour '!' parce que je pensais que 0x01 et ~ 0xFE seraient égaux, mais mon code ne semble toujours pas le penser. – Justin

Répondre

7

Le compilateur a plié les deux cas return 1 dans le même code exact. Les deux tests if se connectent à la même instruction d'assemblage. Chaque instruction ne peut être étiquetée qu'avec un seul numéro de ligne pour le débogueur, vous voyez donc ce comportement étrange. Si vous compilez avec -g et sans-O (ou encore plus explicitement utiliser -O0) il fera des cas distincts et les choses seront plus claires.

+1

Mais il n'y a aucun numéro de ligne sans -g, non? Je dirais qu'il s'agit plutôt de désactiver les -O dans les drapeaux du compilateur. Encore un bon point, cependant. + – Kos

-1

Vous comparez un int à un bool. C'est un mauvais style pour commencer, et certains compilateurs vont se plaindre.

Peut-être que vous avez confondu ! et ~? !invPktNum retournera false si invPktNum est non-false, et true si c'est faux. Je suis sûr que vous vouliez dire ~invPktNum.

+1

Le résultat de '!' Est un 'int'. – caf

+0

qu'est-ce qu'un "bool"? : P – geoffspear

+0

Oops, vous avez raison. Je voulais dire '~'. Changement d'OP maintenant. – Justin

2

!(0xFE) est 0. Peut-être que ce que vous vouliez était ~(0xFE)?

+0

Oui, vous avez raison. J'ai changé le PO pour refléter cela. – Justin

3

Unaire ! est logique-NON. Si l'opérande est 0, le résultat est 1, sinon le résultat est 0. Cela signifie que !invPktNum est 0, donc l'expression if est vraie.

Vous recherchez probablement un ~ unaire, qui est NOT-bit.


Par ailleurs, il peut apparaître dans un débogueur comme si le deuxième return 1; est en cours d'exécution plutôt que la première, parce que le compilateur peut avoir réorganisés le code et combiné ces deux return 1; déclarations ensemble (en particulier si l'optimisation est activée).

0

Vérifiez que les optimisations du compilateur sont définitivement désactivées pour le mode débogage. (Juste pour être différent de tout le monde)

Questions connexes