IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[VC++2005] Dépassement de tableau en débug, pas de bug en release ?


Sujet :

C++

  1. #1
    Membre éclairé Avatar de LapinGarou
    Homme Profil pro
    R&D Developer
    Inscrit en
    Octobre 2005
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : R&D Developer
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 341
    Par défaut [VC++2005] Dépassement de tableau en débug, pas de bug en release ?
    Bonsoir.

    J'ai un bug assez étrange je trouve. J'ai dans mon moteur 3d un tableau de patches, créé à partir d'une image de 1025x1025.

    J'initialise les variables avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bool TGeoMipMapping::Init( int iPatchSize )
    {...
    m_iPatchSize= iPatchSize; //iPatchSize a pour valeur 17
    m_iNumPatchesPerSide= m_uiSize/m_iPatchSize; //m_uisize a pour valeur 1025 (la taille d'un coté de l'image)
    m_pPatches= new S_PATCH [SQR( m_iNumPatchesPerSide )];
    ...}
    Donc, mon tableau a finalement une taille de 3600 (60*60)
    Or dans un des méandres de mon code, il y a ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int GetPatchNumber( int PX, int PZ )
        {    return ( ( PZ*m_iNumPatchesPerSide )+PX );    }
     
    void TGeoMipMapping::RenderPatch( int PX, int PZ, bool bMultiTex, bool bDetail )
    {...
       int iPatch= GetPatchNumber( PX, PZ );
    ...
       if( m_pPatches[GetPatchNumber( PX, PZ+1 )].m_iLOD<=m_pPatches[iPatch].m_iLOD || PZ==m_iNumPatchesPerSide )
            patchNeighbor.m_bUp= true;
        else
            patchNeighbor.m_bUp= false;
    ...
    }
    que j'ai remplacé par ceci pour savoir où était le bug:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void TGeoMipMapping::RenderPatch( int PX, int PZ, bool bMultiTex, bool bDetail )
    {...
       int iPatch= GetPatchNumber( PX, PZ );
    ...
        int ipatchtemp = GetPatchNumber( PX, PZ+1 );
        int t = m_pPatches[ipatchtemp].m_iLOD;
        if( m_pPatches[ipatchtemp].m_iLOD<=m_pPatches[iPatch].m_iLOD || PZ==m_iNumPatchesPerSide )
            patchNeighbor.m_bUp= true;
        else
            patchNeighbor.m_bUp= false;
    ...
     }
    Le programme plante sur (int t = m_pPatches[ipatchtemp].m_iLOD; ) parce que, logiquement, PZ a atteint 59, et en faisant (59+1)*60 + n'importe quelle valeur de PX, je dépasse mon tableau qui a une taille maxi de 3600.
    Maintenant la question : comment se fait-il que lorsque que je lance le prog en faisant ctrl+F5 (sans debug), le programme plante là dessus, avec seulement F5 (debug), il ne plante pas, et en mode release(CTRL F5) non plus ? Est ce Visual qui ajoute des routines de vérification aléatoirement ? Ou bien est ce moi qui ai loupé quelque chose sur les tableaux en C++ ?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Un comportement indéterminé aura toujours un résultat... indéterminé. Il ne faut pas donc pas s'étonner de ne pas avoir systèmatiquement de plantage, par exemple ça pourrait très bien simplement écraser la valeur de la variable suivante en mémoire. Tu devrais même te réjouir d'avoir crash, ça n'arrive pas toujours de manière aussi évidente dans ce genre de cas.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par LapinGarou Voir le message
    Maintenant la question : comment se fait-il que lorsque que je lance le prog en faisant ctrl+F5 (sans debug), le programme plante là dessus, avec seulement F5 (debug), il ne plante pas, et en mode release(CTRL F5) non plus ? Est ce Visual qui ajoute des routines de vérification aléatoirement ? Ou bien est ce moi qui ai loupé quelque chose sur les tableaux en C++ ?
    Parce que tu as de la chance
    C'est un comportement trés aléatoire. Redémarre ta machine ou va prendre un café et tu peut avoir un autre comportement....
    Toute façon il y as de forte chance que ton application plante plus loin, car tu fait une erreur memoire, et tu ne sait pas ce que tu est en train de changer.

    En gros, si je ne me trompe pas, si la mémoire situé aprés ton tableau est utilisé, cela ne va pas planté. Sinon c'est un crash.
    Le mode DEBUG et RELEASE ne vont pas gérer la mémoire de la même manier. De même si tu utilise le debugeur ou non.

  4. #4
    Membre éclairé Avatar de LapinGarou
    Homme Profil pro
    R&D Developer
    Inscrit en
    Octobre 2005
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : R&D Developer
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 341
    Par défaut
    Ok, donc c'est bien à moi de vérifier que je ne sors pas du tableau. Je pensais pas avoir autant de chance (Loto? ) (J'ai d'ailleurs passé l'après midi à chercher où était l'erreur, vu que c'est aléatoire, suivant le mode de compilation, etc)
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Tableau qui marche pas
    Par solp dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 10/04/2006, 19h21
  2. Tableau 100% fonctionne pas !
    Par sunshine33 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 27/12/2005, 14h23
  3. Réponses: 3
    Dernier message: 23/12/2005, 17h21
  4. [VS.Net 2005][ClickOnce] Mon application ne démarre pas
    Par Vonotar dans le forum Visual Studio
    Réponses: 3
    Dernier message: 07/12/2005, 14h44
  5. [Delphi 2005] Librairie Word (Word_TLB) ne compile pas
    Par Brogomil dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 01/08/2005, 10h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo