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 :

Fonction strlen (segmentation fault)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 126
    Par défaut Fonction strlen (segmentation fault)
    Bonjour à tous,

    j'ai un programme Pro*C qui compile bien mais quand je l'exécute j'ai un segmentation fault :

    LABEL: CORE_DUMP
    IDENTIFIER: A63BEB70

    Date/Time: Tue Jul 22 14:46:17 CDT 2008
    Sequence Number: 626
    Machine Id: 0057246A4C00
    Node Id: tls03
    Class: S
    Type: PERM
    Resource Name: SYSPROC

    Description
    SOFTWARE PROGRAM ABNORMALLY TERMINATED

    Probable Causes
    SOFTWARE PROGRAM

    User Causes
    USER GENERATED SIGNAL

    Recommended Actions
    CORRECT THEN RETRY

    Failure Causes
    SOFTWARE PROGRAM

    Recommended Actions
    RERUN THE APPLICATION PROGRAM
    IF PROBLEM PERSISTS THEN DO THE FOLLOWING
    CONTACT APPROPRIATE SERVICE REPRESENTATIVE

    Detail Data
    SIGNAL NUMBER
    11
    USER'S PROCESS ID:
    409648
    FILE SYSTEM SERIAL NUMBER
    14
    INODE NUMBER
    2048
    PROCESSOR ID
    0
    CORE FILE NAME
    /u001/appli/ss10_dev/sh/core
    PROGRAM NAME
    ss10_SAP_extract
    STACK EXECUTION DISABLED
    0
    ADDITIONAL INFORMATION
    strlen 24
    fSetHv F8
    fExtractS B58
    main 248
    __start 94

    Symptom Data
    REPORTABLE
    1
    INTERNAL ERROR
    0
    Ce programme fonctionnait en 32 bits mais maintenant qu'on est passé en XL C/C++ Runtime for AIX 5.2 (64 bits) ça ne marche plus...

    voici le code de la fonction qui je pense pose pb :

    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
     
    /****************************************************************/
    /*                                                              */
    /* Function : fSetHv                                            */
    /*                                                              */
    /* Description    : Initialize the value and the length         */
    /*                                                              */
    /****************************************************************/
     
    int fSetHv(phvHvName, piIndicator, pcValue)
    VARCHAR *phvHvName;
    short *piIndicator;
    char *pcValue;
    {
     
    if(pcValue == NULL)
       {
       strcpy((char *)phvHvName->arr, "");
       phvHvName->len = 0;
       if(piIndicator != NULL)
          {
          *piIndicator = -1;
          }
       }
    else
       {
       if(piIndicator != NULL) *piIndicator = 0;
       phvHvName->len = strlen(pcValue);
       strncpy((char *)phvHvName->arr, pcValue, phvHvName->len);
       }
    return((piIndicator != NULL)? *piIndicator : 0);
    }
    je sais qu'il y a peut-être cette histoire de pointeur et d'allocation mémoire...mais j'avoue ne pas trop maîtriser ce concept.

    j'ai pensé ajouté ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    phvHvName->arr[phvHvName->len] = '\0';
    mais reste à savoir à quel moment et s'il ne faut pas modifier le code initial.

    Pouvez-vous m'aider svp ?

    Cat

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 126
    Par défaut
    autre chose, lorsque je fais appel à cette fonction dans mon programme main, je passe en paramètre ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fSetHv(&hvD##Var, &ind_D##Var,\
                    fGetHv(&hvD_ENTR_##Table[iRang], &ind_D_ENTR_##Table[iRang]));\
    qui appelle une autre fonction :

    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
     
    /****************************************************************/
    /*                                                              */
    /* Function : fGetHv                                            */
    /*                                                              */
    /* Description    : Return a pointer on string value            */
    /*                                                              */
    /****************************************************************/
     
    char *fGetHv(phvHvName, piIndicator)
    VARCHAR *phvHvName;
    short *piIndicator;
    {
    phvHvName->arr[phvHvName->len] = '\0';
    return((piIndicator != NULL &&
            *piIndicator == -1)? NULL : (char *)phvHvName->arr);
    }
    et ici on retrouve bien la ligne
    phvHvName->arr[phvHvName->len] = '\0';

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2008
    Messages : 17
    Par défaut
    Salut,

    Etant donné la pile d'appel, çà ne serait pas plutôt la chaîne pcValue qui poserait pb ?

    ++

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 126
    Par défaut
    je ne sais pas...

    tu veux dire qu'il faudrait modifier la longueur de pcValue? comment faire dans ce cas-là?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pcValue->len = strlen(pcValue) + 1;
    c'est possible ça ? je rappelle que pcValue est déclaré de la manière suivante:

    ou bien peut-être ajouter le caractère de fin de ligne dans pcValue?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pcValue->arr[pcValue->len] = '\0';
    je ne sais même pas si c'est possible...

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hoe,

    Je ne vois aucune initialisation pour tes 3 pointeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    VARCHAR *phvHvName;
    short *piIndicator;
    char *pcValue;

  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
    Citation Envoyé par droggo Voir le message
    Hoe,

    Je ne vois aucune initialisation pour tes 3 pointeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    VARCHAR *phvHvName;
    short *piIndicator;
    char *pcValue;
    C'est la declaration des parametres de la fonction selon le style K&R (Kernighan et Ritchie), c'est vrai que ca fait longtemps que j avais pas vu ca

Discussions similaires

  1. Erreur (segmentation fault) dans une fonction
    Par med1001 dans le forum C
    Réponses: 2
    Dernier message: 16/04/2012, 09h47
  2. Réponses: 1
    Dernier message: 10/06/2011, 10h13
  3. Réponses: 3
    Dernier message: 21/01/2008, 14h38
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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