Attention: débordement dans la conversion constante implicite
Dans le programme suivant, la ligne 5 ne donnent débordement d'avertissement comme prévu, mais, étonnamment, la ligne 4 ne donne pas d'avertissement dans GCC: http://www.ideone.com/U0BXn
int main()
{
int i = 256;
char c1 = i; //line 4
char c2 = 256; //line 5
return 0;
}
Je pensais les deux lignes doivent donner débordement avertissement. Ou est-il quelque chose que je suis absent?
Le sujet qui m'a amené à faire cette expérience, c'est ceci: typedef type de vérification?
Là, j'ai dit que la suite(que j'ai supprimé de ma réponse, parce que quand je le lance, il ne se présentent pas comme je l'avais prévu):
//However, you'll get warning for this case:
typedef int T1;
typedef char T2;
T1 x = 256;
T2 y = x; //possible overflow warning! (but it doesn't give warning :()
source d'informationauteur Nawaz | 2011-02-23
Vous devez vous connecter pour publier un commentaire.
-Wall
n'inclut pas beaucoup d'options.-Wconversion
est l'un d'entre eux et met en garde sur le comportement qui vous intéresse.Voir http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
Dans le cas général d'affectation d'un
int
de la valeur à unchar
objet, le compilateur ne sait pas si laint
est hors de portée de lachar
.À l'avertissement de plus près:
Il est dans ce cas précis, où une constante qui est converti
char
que le compilateur est capable de vous avertir. De même, si vous avez changé la déclaration dei
êtreconst
:vous aurez aussi l'avertissement, parce que la valeur attribuée à
c2
est une expression constante.Note également que l'avertissement est quelque peu trompeur, car la conversion n'est pas techniquement "dépassement". Dépassement de capacité arithmétique des rendements comportement indéfini en C++. Une conversion restrictive (comme
int
àchar
siint
a une plus grande portée que leschar
) les rendements de certains de la mise en œuvre de conversion définis par l'.Bien, la ligne 5 est une erreur évidente que n'importe quel compilateur peut voir directement, et toujours une erreur. La ligne 4, il faudrait au moins certains analyse de flux de données pour découvrir l'erreur. Peut-être que ce n'est pas effectuée avec les paramètres utilisés sur le site, ou peut-être les rédacteurs du compilateur, je ne considère pas cela assez important de le comprendre.
Post GCC 4.3, la sémantique de
-Wconversion
ont été mis à jour pour détecter les conversions implicites qui pourraient modifier une valeur, mais vous devez activer-Wsign-conversion
ainsi, parce que sinon, vous n'obtiendrez pas un avertissement pour du code qui pourrait changer le signe d'un nombre en raison de la contrainte entre les entiers signés et non signés.Contrairement à ce que l'Crazy Eddie dit, avant de GCC 4.3 (qui n'avait pas encore sorti à l'époque)
-Wconversion
n'a pas génériquement vérifier les problèmes introduits par implicite de conversion de type et la comme. Plutôt, il a vérifié si votre programme devrait comporter différemment de ce qu'il se serait comporté si l'on avait utilisé de vieux style K&R des prototypes de fonction.Cela ne signifiait pas seulement qu'il n'a pas donner un avertissement sur tous les types implicites de conversion ou de coercition à des problèmes, mais cela signifiait aussi que certains bon code a donné un inutile d'avertissement. Et bien sûr, vous obtiendrais pas d'erreur avec
g++
parce que ces prototypes ne sont pas valide en C++, de toute façon.