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 :

bug ou probleme?


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut bug ou probleme?
    Bonjour,

    Lors de mon programme suis heurté à un problème que je comprend pas.
    Mon programme fonctionne bien sous windows et que je le lance sous linux je rencontre le probleme suivant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    int lgMax[16]={30,6,100,100,40,20,40,40,100,100,100,100,100,10,40,40};
     
    for(i=0;i<zone;i++)
        {
          strcpy(champ,&ligne[position[i]]); 
          lgMax[0]=30; //remet la valeur a 30 sinon bug... je c'est pas pourquoi
          if(strlen(champ)>lgMax[i])
          {
            strcpy(champ," ");
          }
          if(i==2)
            printf("%d ",lgMax[0]);//affiche 30
          while(strlen(champ)<lgMax[i]+1)
            strcat(champ," ");
            //lgMax bug après la boucle quand i=2
          if(i==2)
          {
            printf("%d ",lgMax[0]);//affiche 0
            exit(0);
          }
          fwrite (champ , 1 , lgMax[i] , fDest );
        }
    Je comprend pas pourquoi dans mon for quand i=2 ca remet ma valeur lgMax[0] à 0 (les autres valeurs du tableau ne change pas)
    Quelqu'un pourrait m'orienter sur le pourquoi de ce problème?

    merci

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Intuitivement, je dirais que ton premier strcpy déborde et vient écraser le tableau lgMax.
    Tu dois avoir quelque par un char champ[TAILLE_MAX]. Tu devrais donc utiliser quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strncpy(champ,&ligne[position[i]],TAILLE_MAX);

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Sans la déclaration de champ, ça ne va pas être facile...

    Mais ça sent le débordement de buffer, donc surveille un peu mieux ce que tu fais avec champ, et regarde si tu mets une variable entre les deux, si c'est elle qui est modifiée à la place...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par totofe Voir le message
    Lors de mon programme suis heurté à un problème que je comprend pas.
    Mon programme fonctionne bien sous windows et que je le lance sous linux je rencontre le probleme suivant.
    Poste un code compilable. Il est impossible d'analyser ton code. Trop d'inconnues.

  5. #5
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Poste un code compilable. Il est impossible d'analyser ton code. Trop d'inconnues.
    désolé, je voulais pas copier le code enterrement, car il est plutôt immense.
    j'ajoute les différentes variables, ainsi qu'un bou de code réalisé avant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    int zone;
      int i,t;
      char ligne[1024];
      int position[16];
      int lgMax[16]={30,6,100,100,40,20,40,40,100,100,100,100,100,10,40,40};
      int pos; 
      char champ[101];
     
     if ((fDest = fopen(nomdest, "w")) == NULL)//Créé le fichier fixe test si erreure
      {
        sprintf(txterr,"impossible d'ouvrir le fichier %s \n",nomdest); 
        Ecriture_err();
        return(-2);
      }
     
      nb_ligne=0;
     
      while(fgets(ligne,sizeof(ligne), fic_header)) //compte nombre de ligne sans le header et ajout des data dans le fichier fixe
      {
        nb_ligne++;
        trimCRLF(ligne);
        //Ecriture
     
        t=strlen(ligne);
        zone=1;
        position[0]=0;
        for(i=0;i<t;i++)//remplace les ; par des \0
        {
          if(ligne[i]==';')
          { 
            ligne[i]=0;       
            position[zone++]=i+1; //donne la position de debut de chaque champs
          }                       
        }
        if (zone>16)// + de 15 champs
        {
          log=1;
          sprintf(txterr,"Attention il existe au moins un champ en trop à la ligne %d \n",nb_ligne+1);
          Ecriture_err();
          continue;
        }
    for(i=0;i<zone;i++)
        {
          strcpy(champ,&ligne[position[i]]); 
          lgMax[0]=30; //remet la valeur a 30 sinon bug... je c'est pas pourquoi
          if(strlen(champ)>lgMax[i])
          {
            strcpy(champ," ");
          }
          if(i==2)
            printf("%d ",lgMax[0]);
          while(strlen(champ)<lgMax[i]+1)
            strcat(champ," ");
          if(i==2)
          {
            printf("%d ",lgMax[0]);
            exit(0);
          }
            //lgMax bug après la boucle quand i=2
        }
    désolé je peux pas poster de code compilable à moins de mettre tout mon programme.

  6. #6
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    j aime bien le titre, si c'est un bug c'est pas un problème ?

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par totofe Voir le message
    désolé, je voulais pas copier le code enterrement, car il est plutôt immense.
    j'ajoute les différentes variables, ainsi qu'un bou de code réalisé avant
    <...>
    désolé je peux pas poster de code compilable à moins de mettre tout mon programme.
    Alors il faut apprendre à réduire me code au minimum compilable qui montre le problème, car ce n'est pas à nous de le faire. C'est d'ailleurs une technique de mise au point bien connue et très efficace.

    D'une manière plus générale, ton code devrait être organisé en modules indépendants et testables individuellement. Ca fait partie des règles de Bonne Conception.

  8. #8
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    J'ai trouvé.
    C'était ma variable champ qui débordé étrange car elle ne pouvait pas dépassé 100 (valeur max dans lgMax). et ce problème ne se rencontré que sur linux...
    j'ai augmenté la taille du tableau de 1 et ça fonctionne.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par totofe Voir le message
    J'ai trouvé.
    C'était ma variable champ qui débordé étrange car elle ne pouvait pas dépassé 100 (valeur max dans lgMax). et ce problème ne se rencontré que sur linux...
    j'ai augmenté la taille du tableau de 1 et ça fonctionne.
    Non. Le problème se rencontre partout. Simplement comme le dépassement de tableau entraine un comportement est indéfini, les conséquences sont imprévisibles. Il peut arriver n'importe quoi, y compris un comportement conforme aux attentes, ce qui fait que ce bug (comportement indéfini) est particulièrement dangereux et fait que le C n'est pas un langage de débutant.

    http://emmanuel-delahaye.developpez.com/notes.htm#ub


    .

  10. #10
    Membre Expert
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Il peut arriver n'importe quoi, y compris un comportement conforme aux attentes, ce qui fait que ce bug (comportement indéfini) est particulièrement dangereux et fait que le C n'est pas un langage de débutant.
    Merci pour l'infos.

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par totofe Voir le message
    J'ai trouvé.
    C'était ma variable champ qui débordé étrange car elle ne pouvait pas dépassé 100 (valeur max dans lgMax). et ce problème ne se rencontré que sur linux...
    j'ai augmenté la taille du tableau de 1 et ça fonctionne.
    Donc, dès que tu vas lire une ligne de 101 caractères

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ce code montre seulement ce qui doit être fait quand la variable champ a déjà débordé.
    Il n'empêche en rien le débordement...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    non mais regarder un peut le programme, je vois pas comment elle peut dépasser 100.

    je remet l'endroit ou cela produisait le bug avec l'initialisation des variable concerné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    char champ[102]//avec char champ[101] ca bugué
    int lgMax[16]={30,6,100,100,40,20,40,40,100,100,100,100,100,10,40,40};
     
    if(strlen(champ)>lgMax[i])
          {
            strcpy(champ," ");
          }
     
    while(strlen(champ)<lgMax[i]+1)
            strcat(champ," ");
    lgMax à pour valeur 100 au maximum...
    donc je vois pas pourquoi la variable champ déborde (et pour rappelle ça se produit uniquement sous linux).

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Mais c'est exactement ce que je dis: Tu ne vérifies le débordement qu'après coup...

    Il faut empêcher AVANT...

    ... Et pense au caractère nul de fin de chaîne.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ce code montre seulement ce qui doit être fait quand la variable champ a déjà débordé.
    Il n'empêche en rien le débordement...
    Je vois pas ou il pourrait déborder. avant ceci je stocke dans champ une chaine de 10caractères au max.
    et ça déborde quand i=2 soit quand lgMax[2]=100, je pense c'est dû au strcat...
    mais je reste toujours dans le flou sur la raison.

  16. #16
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    Citation Envoyé par Médinoc Voir le message

    ... Et pense au caractère nul de fin de chaîne.
    oui pour cette raison que j'ai mis champ[101] et non champ[100]

  17. #17
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    TU fais des strcat jusqu'à ce que la longueur caractère nul non-compris atteigne 101, ce qui fait 102 caractères en comptant le nul...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  18. #18
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    effectivement tu à raison ^^.

    Mais pourquoi cela ce produit uniquement sur linux?

  19. #19
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Parce que c'est un comportement indéfini, tout peut arriver.

    Peut-être que sous Windows, l'alignement entre en jeu, ou que les variables locales ne sont pas dans le même ordre, etc.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  20. #20
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par totofe Voir le message
    effectivement tu à raison ^^.

    Mais pourquoi cela ce produit uniquement sur linux?
    C'est un comportement indéfini. Il est illusoire d'essayer d'expliquer quelque chose qui n'est pas défini.

    Nota : je t'ai déjà répondu sur ce point. Si tu ne lis pas mes réponses, c'est pas le peine que les poste. Je les efface ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. BUG IE8 probleme d'affichage
    Par tidou95220 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 27/01/2011, 15h18
  2. probleme setInterval bug
    Par lea94140 dans le forum Flash
    Réponses: 1
    Dernier message: 27/04/2007, 08h40
  3. Réponses: 4
    Dernier message: 22/06/2006, 06h43
  4. Probleme de requete+ gros bug access
    Par shub dans le forum Access
    Réponses: 8
    Dernier message: 04/05/2006, 13h23
  5. Réponses: 2
    Dernier message: 18/02/2006, 09h20

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