2011-08-12 5 views
1

J'utilise MSVS2010 pour un précédent projet développé en C.Runtime Basic Check in VS C++ 2010

Je vois un problème avec débogage ou mode de libération. Le mode debug me donne mon résultat attendu alors que le mode release me donne un mauvais résultat et les résultats produits par le mode release sont différents dans tous les runs (très différents). Ensuite, je suis allé aux propriétés du projet et j'ai activé le Basic Runtime Check (BRC) pour le mode Release. Si je fais tourner BRC sur "Stack Frames (RTCs)" ou sur RTC1, le résultat est le même que le mode Debug. Si je n'utilise que des variables non initialisées (RTCu), le résultat est faux.

Lorsque j'allume tous les avertissements, il y a 3 types d'avertissement dans le programme: 1. Remplacer une fonction X par une fonction X_s (pour désactiver _CRT_SECURE_NO_WARNINGS d'utilisation) 2. Les « < »: signé/non-concordance non signé. La raison en est que j'ai défini

#define NO_OF_INPUTS 20 
int j; 
j = 0; 
while (j<NO_OF_INPUTS) //The warning is for this line 
{…} 

4 octets de remplissage ajoutés après le membre de données 'État'. Voici la struct:

typedef struct X 
{ 
    int State; 
    double Value; 
} XName; 

Faire une recherche sur google, j'ai trouvé: http://msdn.microsoft.com/en-us/library/8wtf2dfz(v=vs.80).aspx

donc je suppose que les choses de rembourrage peut être la chose ... Je ne sais pas si

Toute suggestion de fixer l'insecte? Et d'autres avertissements si possible ...

Meilleur.

Répondre

1

Il semble difficile de vous donner un bon indice car d'habitude de tels problèmes surviennent à un moment donné du code où le programmeur fait des suppositions (conscientes ou non) qui ne sont pas garanties (comme l'initialisation de la mémoire etc.) par le la norme. Un tel comportement peut également résulter de l'écriture/lecture dans/de la mémoire qui n'est pas "vôtre" (mais en mode débogage, la mémoire a été initialisée ou vous lisez/écrivez des octets qui ne sont pas requis par le programme).

C'est certainement une bonne idée de corriger les avertissements tels que vous les avez décrits. Cependant, il me semble que cela ne va pas nécessairement aider. Vous pouvez essayer cppcheck pour obtenir des avertissements comme de la mémoire non initialisée.

S'il s'agit d'un problème de mémoire, vous risquez de ne pas recevoir les avertissements du compilateur. Dans ce cas, Microsofts (gratuit) "Application Verifier" peut parfois aider. Si ce n'est pas le cas, vous devez écrire des tests unitaires pour vous rapprocher du problème. C'est une bonne idée de toute façon ...