avertissement: la comparaison est toujours faux en raison de la portée limitée de type de données dans gcc 4.1.2
J'ai rencontré le message d'avertissement suivant à partir de gcc 4.1.2:
warning: comparison is always false due to limited range of data type
concernés du code C est comme:
if ( unlikely(count < 0) ) BUG();
où 'count' est pas signé.
J'ai essayé de désactiver l'avertissement puisque je n'étais pas autorisé à modifier le code source:
-Wno-type-limits
mais il semble gcc 4.1.2 ne le supporte pas.
cc1: error: unrecognized command line option "-Wno-type-limits"
Toutes les autres façons de se débarrasser de cet avertissement?
Pourquoi ne pas garder l'avertissement? Peut-être que le propriétaire du code source pour le voir; aussi se débarrasser de, il pourrait masquer d'autres bugs.
Êtes-vous coincé avec ce code? Est-il code généré?
Je pense que c'est GCC, pas de GDB, qui génère le message d'avertissement. GDB version 4 est beaucoup plus ancien que celui de GCC 4.1.2 (bien que GCC 4.1.2 est assez vieux, peut-être, circa 2006).
Êtes-vous coincé avec ce code? Est-il code généré?
Je pense que c'est GCC, pas de GDB, qui génère le message d'avertissement. GDB version 4 est beaucoup plus ancien que celui de GCC 4.1.2 (bien que GCC 4.1.2 est assez vieux, peut-être, circa 2006).
OriginalL'auteur user1783732 | 2013-03-14
Vous devez vous connecter pour publier un commentaire.
Un
unsigned
valeur ne sera jamais négative — d'où l'avertissement. Ce n'est pas tellement "peu probable" que des "impossible".Cela indique généralement qu'il y a un bug dans le code, de la sorte; le code a été écrit en attend un type qui pourrait permettre à des valeurs négatives, mais le type ne permet pas de valeurs négatives. Donc, il est tout à fait possible que le code se comporte mal en raison de l'inadéquation entre les attentes.
Noter que sur certaines machines, la plaine
char
est signé et sur d'autres non signés (et c'est un type distinct designed char
etunsigned char
même si sa gamme de valeurs des chevauchements avec l'un ou l'autre).Est-ce votre code ou quelqu'un d'autre code? Si c'est votre code, dans quelles circonstances est le type de
count
signé de la quantité? Pouvez-vous faire le test conditionnel sur le type decount
être signé? Si c'est quelqu'un d'autre code, avez-vous demandé à ce sujet? Avez-vous envisagé la mise à niveau vers une plus récente, le compilateur ou n'est-ce pas permis, non plus? Avez-vous pensé à la compilation sans-Wall
? Si vous ne pouvez pas modifier le code, il n'y a pas de vertu en voyant les mises en garde, car vous n'allez pas être en mesure de faire quelque chose à leur sujet. Aussi, c'est un avertissement; c'est ignorable — pourquoi ne pas simplement l'ignorer?OriginalL'auteur Jonathan Leffler
Selon l'âge, le code source est, il pourrait être écrite de façon défensive pour une période de temps où les compilateurs n'ont pas été en tant que type-safe que gcc est maintenant.
L'avertissement regarde comme il fait partie de l'-Wextra (aka -W) option d'avertissement de jeu, donc si vous voulez des avertissements supplémentaires, qui sera l'un d'eux. Personnellement, j'utilise -Mur, qui croire ou non, ne comprend pas le "plus" du truc. On pourrait penser que "tous" comprendrait des "extra" mais je ne crois pas...
cet avertissement fait partie d'-Wextra selon la documentation: gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Warning-Options.html
OriginalL'auteur SeKa
les options de correction de cet avertissement:
supprimer les conditions qui toujours vrai
meilleur: supprimer les conditions qui toujours vrai + ajouter static_assert à assurer est de type unsigned. (pour la version C de static_assert look ici)
pour gcc avant la 4.3: suppression de l'option de compilateur: -Wextra
pour gcc 4.3+ ajout de l'option: -Wno-type-limites
OriginalL'auteur Maxim Kholyavkin
La variable utilisée dans la comparaison a été déclaré comme un 8 bits unsigned int.Quand je l'ai changé pour 32 bits non signé, l'avertissement a été supprimé.
Vieux:
u_int8_t variable = 0;
Correctif:
uint32_t variable = 0;
OriginalL'auteur PriyaGp