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

Langage C++ Discussion :

Violation d'accès en lecture écriture


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Par défaut Violation d'accès en lecture écriture
    Bonjour,

    J'ai un projet qui a été écrit et compilé en version antérieur à Visual Studio 2005 et qui fonctionnait très bien. Ce programme fournit une dll. Depuis que ce projet a été compilé avec Visual Studio 2005 il ne fonctionne plus et envoi des messages à tout va pour des violations d'accès en lecture écriture. J'insiste sur le changement de compilateur. Je donne ici peut être l'un des problèmes le plus basic dans la fonction suivante :

    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
    62
    63
    64
    65
    bool ACG_IMPORT WORD97_ChangeString(ObCharFld &RS, ObCharFld &OldHeader, ObCharFld &OldSeparator, ObCharFld &NewHeader, ObCharFld &NewSeparator) 
    {
      int len_olds;
      int len_newh = 10240;
      int len_news;
      int n;
     
      char *oldh = OldHeader.GetText();
      char *olds = OldSeparator.GetText();  
      char *newh;
      char news[128];
     
      if (!Is_FCT_loaded(Convert))
        Convert = (TConvert)GetProcAddress(word_hm, "Convert");
      if (!Is_FCT_loaded_Msg(Convert))
        return (false);
     
      /* verification des parametres pour eviter un SEGVIO */
      if (!NewSeparator.GetText() || !oldh || !olds || (len_olds = strlen(olds)) == 0 || (len_news = Convert(news, NewSeparator.GetText())) == 0 || 
        strncmp(oldh, olds, len_olds)) 
       {
         RS.SetText("ERR");
         return false;
       }
     
      oldh += len_olds; // suppression du separateur en debut de chaine
     
      /* allocation d'une chaine pour le nouvel header */
      newh = new char [len_newh];
      n = 0;
      newh[n++] = '\"';
     
      while (*oldh)
        {
          if (!strncmp(oldh, olds, len_olds))
            {
    	  /* C'est un separateur => remplacer par le nouveau separateur */
    	  strcpy_s(&newh[n], len_newh, news); /* remplace par le nouveau separateur */
    	  while (newh[n]) n++; /* se positionne a la fin */
    	    oldh += len_olds; /* deplacement dans la chaine */
    	}
            else
    	  /* C'est un caractere comme un autre */
    	  newh[n++] = *oldh++;
          /* petit test pour eviter que le buffer soit trop petit */
          if (n >= len_newh - len_news - 1)
            {
    	  char *tmp;
    	  int new_len;
              new_len = len_newh * 2;
              tmp = new char [new_len];
    	  memcpy(tmp, newh, len_newh);
    	  newh = tmp;
    	  len_newh = new_len;
           }
        }
     
      /* fermeture du nouvel header */
      newh[n++] = '\"';
      newh[n] = '\0';
     
      NewHeader.SetText(newh);
      RS.SetText(" ");
      return true;
    }
    Tout se passe bien lors du premier appel à cette fonction, mais ça se plante donc par une vilation d'accès lors du deuxième appel sur la ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newh = new char [len_newh];
    Le fait de rajouter en fin de fonction le code
    fait que ça se plante lors du premier appel à cette fonction et sur cette ligne ajoutée...

    D'avance merci pour vos solutions

  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
    Salut,
    pointeur = new Type[XXX] -> delete []pointeur;

    Sinon, pourquoi utiliser une allocation dynamique ? pourquoi ne pas utiliser std::string ou std::vector pour encapsuler de façon plus sûre ces allocations ?

  3. #3
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    pointeur = new Type[XXX] -> delete []pointeur;
    ?
    Oui en fait je m'en suis rendu compte après mon message et j'ai corrigé comme cité mais rien ni fait

    Citation Envoyé par 3DArchi Voir le message
    Sinon, pourquoi utiliser une allocation dynamique ? pourquoi ne pas utiliser std::string ou std::vector pour encapsuler de façon plus sûre ces allocations ?
    Ca me fait ré-écrire une fonction qui marchait bien jusqu'à présent et que ce n'est pas le seul problème dans mon projet du même genre...

  4. #4
    Membre averti
    Inscrit en
    Mars 2010
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 35
    Par défaut
    Bonjour,

    la ligne semblant poser problème pour la libération du pointeur est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy_s(&newh[n], len_newh, news);
    Pourquoi ???

    J'ai donc utilisé la classe string en effet beaucoup plus sûre et demandant beaucoup moins de lignes de code.... merci 3DArchi

  5. #5
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    Bonjour,
    Citation Envoyé par 3Fred9 Voir le message

    la ligne semblant poser problème pour la libération du pointeur est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy_s(&newh[n], len_newh, news);
    Pourquoi ???
    à priori je dirai qu'il aurait fallut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy_s(&newh[n], len_newh - n, news);
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  6. #6
    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
    Avec std::string, bye bye strcpy et autres fonctions peu sûre.
    Il existe des fonctions de std::string ou des surcharges des opérateurs pour travailler avec des std::string et des chaînes C.
    Ensuite, comme le dit Bruno, il faudrait que tu précises ce que doivent être n, len_newh etc..

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

Discussions similaires

  1. Accès multiples lecture écriture
    Par PhilLU dans le forum Requêtes
    Réponses: 3
    Dernier message: 22/07/2013, 05h04
  2. Erreur d'accès en lecture/écriture à un fichier Excel !
    Par Mistraldor dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 17/08/2011, 14h39
  3. Réponses: 1
    Dernier message: 07/10/2010, 13h14
  4. droits d'accès en lecture écriture (débutant!)
    Par hucliez dans le forum Apache
    Réponses: 1
    Dernier message: 12/12/2008, 23h33

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