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

Linux Discussion :

[PERROR + read]Bad address


Sujet :

Linux

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 50
    Points : 38
    Points
    38
    Par défaut [PERROR + read]Bad address
    Bonjour,
    Voila, je suis entrain de realiser un petit programme dans le cadre de mes etudes, et pour l'instant le sujet est "simple" je dois parser un fichier et sortir des erreurs (ou non) suivant une syntaxe precise.
    Pour ce faire, j'utilise la fonction read pour parcourir le fichier, caractere par caractere.
    Histoire d'eviter un seg-falt completement indetectable par l'humain, j'utilise perror();
    Et ce dernier me sort systematiquement une erreur (Ce qui n'etait pas le cas au debut) "read failed : Bad Adresse"

    Alors voila un bout de mon code

    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
     
     /*
      ** Boucle principale du parsing
      **/
     
      while ((i = read(fd,tmp,1)))
      {
        if ( i < 0)
        {
          if (errno == EINTR)
          {
            continue;
          }
          else
          {
            perror("read failed");
            return (2);
          }
        }
    /* 
    **  Ici y a la suite de ma boucle principale 
    */
    }
    Donc en faite mon probleme, c'est que systematiquement il me pete une erreur d'adresse quand je tente de lancer mon programme avec un fichier qui contient au moins un caractere.
    Si le fichier ne contient pas de caractere le programme s'execute normalement (Du coups mon programme devient inutile, c'est con hein...)
    Je dois avouer que je suis un peu perdu quand je vois le comportement de perror....

    Merci d'avance...

    EDIT : En faite, c'est pas le comportement de perror() qui me gene, mais plutot celui de read, pourquoi es ce que la lecture n'est pas possible !
    Plus haut dans mon code, je gere les differentes erreurs genre, ouverture, existence du fichiers etc... et ca l'air de bien se passer, alors pourquoi read veut pas !?

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Quel est le type et la dimension de tmp ? Ce doit etre au moins
    pour contenir le byte que tu veux lire.

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 50
    Points : 38
    Points
    38
    Par défaut
    C'est un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char *tmp;
     
    /*
    **  Et plus loin dans le code il y a...
    */
     
    tmp = malloc(sizeof(char));
     
    /*
    ** et encore plus loin...
    */
     
    free(tmp);

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 108
    Points : 67
    Points
    67
    Par défaut Additif sur tmp
    Bonjour,

    A écrire plutôt:

    tmp = (char *)malloc(sizeof(char)) ;

    Cordialement

  5. #5
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par KiKiTiTi Voir le message
    A écrire plutôt:
    tmp = (char *)malloc(sizeof(char)) ;
    Non, le cast n'est pas necessaire en C. Il est meme preferable de l'eviter.

    Moumoutte: Pour essayer de comprendre ce qui se passe, il faudrait regarder la valeur de errno apres l'echec de read(). Cela donnera une idee plus precise du probleme. Tu testes deja EINTR, regarde les autres:
    Citation Envoyé par man 2 read
    EAGAIN Non-blocking I/O has been selected using O_NONBLOCK and no data was immediately available for reading.

    EIO I/O error. This will happen for example when the process is in a background process group, tries to read from its controlling tty, and
    either it is ignoring or blocking SIGTTIN or its process group is orphaned. It may also occur when there is a low-level I/O error while
    reading from a disk or tape.

    EISDIR fd refers to a directory.

    EBADF fd is not a valid file descriptor or is not open for reading.

    EINVAL fd is attached to an object which is unsuitable for reading.

    EFAULT buf is outside your accessible address space.

    ERESTARTSYS
    J'aurais tendance a dire que dans ton cas, errno est a EFAULT, mais je ne vois pas pourquoi.

  6. #6
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Le malloc n'a pas échoué ?
    Un malloc de 1 seul caractère, c'est moche, autant déclarer directement un char.
    Ton fichier est bien ouvert et tout ?
    T'as pas un buffer overflow ?

    Y'a pas moyen d'avoir un peu plus de code ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 50
    Points : 38
    Points
    38
    Par défaut
    Desole de repondre si tard, je voulais finir mon sujet ...

    Bon alors pour remedier au probleme, j'ai declarer un char et j'ai ensuite joue avec le passage par adresse et tousssssa pour pouvoir ecrire dans mon buffer(de 1 caractere)

    Effectivement d'apres mon prof, il y avait surment un probleme d'allocation, peut etre un probleme avec malloc ou je ne sais pas... Bref j'ai donc changer mon code (comme je le dis un peu plus haut)

    Merci pour vos differentes reponses !

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 17/10/2012, 16h48
  2. access violation at adress 0057744.read of address 000000
    Par zanoubya dans le forum Débuter
    Réponses: 2
    Dernier message: 21/06/2010, 17h34
  3. Probleme avec read : Bad adress
    Par neo62matrix dans le forum C
    Réponses: 1
    Dernier message: 17/04/2009, 19h34
  4. Réponses: 1
    Dernier message: 09/07/2008, 09h29
  5. [SOLARIS] Bad address lors de la commande ifconfig
    Par fedfil dans le forum Solaris
    Réponses: 1
    Dernier message: 23/04/2007, 11h41

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