2008-09-16 6 views
3

Le compilateur Visual Studio ne semble pas avertir sur les affectations signées/non signées, uniquement sur les comparaisons. Par exemple, le code ci-dessous génère un avertissement sur l'instruction if mais pas sur les affectations initiales.Faire compilateur VS attraper les assignations signées/non signées?

est-il de toute façon de le faire attraper ces? Je suis déjà à W4 mais j'ai pensé (espéré) qu'il pourrait y avoir un autre réglage quelque part.

Merci,

int foo(void) 
{ 
    unsigned int fooUnsigned = 0xffffffff; 
    int fooSigned = fooUnsigned; // no warning 

    if (fooSigned < fooUnsigned) // warning 
    { 
     return 0; 
    } 

    return fooSigned; 
} 

Mise à jour:

Quamrana est juste, cela est contrôlé par avertissement 4365 qui semble être désactivé par défaut, même à W4. Cependant, vous pouvez explicitement l'activer pour un niveau d'avertissement donné comme ça;

#pragma warning (4 : 4365) 

Ce qui résulte en;

warning C4365: 'initializing' : conversion from 'unsigned int' to 'int', signed/unsigned mismatch 
+0

Je ne savais pas qu'il y avait un #pragma pour transformer les avertissements sur. Le problème avec le #pragma est qu'il doit être répété dans chaque module où vous voulez l'avertissement. – quamrana

Répondre

6

Vous devez activer l'avertissement 4365 pour capturer l'affectation.

Cela pourrait être difficile - vous devez activer TOUS les avertissements - utilisation/mur qui permet beaucoup d'avertissements, vous pouvez donc avoir une certaine difficulté à voir l'avertissement se produire, mais il le fait.

+0

Vous pouvez également utiliser l'avertissement #pragma (par défaut: 4365) pour l'activer. – ChrisN

0

@quamrana:

Il doit y avoir quelque chose au-delà de l'option/mur pour permettre avertissement 4365:

C:\Temp>cl /Wall /c foo.c 
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86 
Copyright (C) Microsoft Corporation. All rights reserved. 

foo.c 
foo.c(6) : warning C4018: '<' : signed/unsigned mismatch 

Je vois que Andrew eu à travailler, mais que quelqu'un a une idée pourquoi ce n'est pas travaillé ici? Les docs Visual Studio indiquent que cela devrait être le cas, mais je ne peux même pas obtenir l'exemple de programme dans les docs pour donner l'avertissement C4365 (bien qu'il donne l'avertissement C4245 associé - mais cela se produit avec juste une option/W4 en tous cas).

2

Vous pouvez modifier le niveau d'un avertissement spécifique en utilisant/W [niveau] [code]. Donc, dans ce cas/W34365 fera 4365 avertissement dans un avertissement de niveau 3. Si vous le faites souvent, vous pourriez trouver utile de placer ces options dans un fichier texte et d'utiliser l'option @ [fichier] pour simplifier la ligne de commande.

+0

Le/w doit être en minuscules. –

Questions connexes