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

PostgreSQL Discussion :

Librairie C(.so), pointeurs inutilisables?


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut Librairie C(.so), pointeurs inutilisables?
    Bonjour, je travaille avec PostgreSQL 8.3.5 sur FreeBSD 7.0 et j'essai de faire fonctionner du code C.
    Le probleme, c'est que je ne peux pas utiliser le type "char *" sous peine d'avoir un
    "
    ERROR: invalid memory alloc request size 18446744073709551613

    ********** Erreur **********

    ERROR: invalid memory alloc request size 18446744073709551613
    État SQL :XX000

    "

    Voici 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
    24
    25
     
    #include "/usr/local/include/postgresql/server/postgres.h"
    #include "/usr/local/include/postgresql/server/fmgr.h"
    #include <string.h>
     
    #ifdef PG_MODULE_MAGIC
    PG_MODULE_MAGIC;
    #endif
     
    Datum myFunction(PG_FUNCTION_ARGS);
     
    PG_FUNCTION_INFO_V1(myFunction);
    Datum
    myFunction(PG_FUNCTION_ARGS)
    {
            text *newName;
    //      char *temp = NULL;
     
            if( PG_ARGISNULL(0) || PG_ARGISNULL(1))
            {
                    PG_RETURN_NULL();
            }
            newName = PG_GETARG_TEXT_P(0);
            PG_RETURN_TEXT_P(newName);
    }
    Si je commente la ligne char * temp = NULL;, j'ai un resultat vide en guise de compensation (normal).
    Mais si je décommente, paf, Error.
    J'ai bien testé sans l'initialisation du pointeur ou en changeant de nom sans résultats.
    Aurais-je oublié quelque chose?

    EDIT:
    J'ai essayé de passer par un void * , même topo. Avec un int*, pareil. On ne peut pas utiliser de pointeurs autre que text*?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut
    Il semblerait que l'on soit obligé d'encapsuler le pointeur par une structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct Data
    {
        char * m_temp;
    }Data;

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Une question: pourquoi penser que le problème vient de temp (qui n'est pas utilisée dans le code montré), alors que newName est renvoyé à l'appelant alors qu'il a un contenu indéterminé et que c'est plutôt ça qui parait susceptible de faire planter?

    Qu'est-ce que cette fonction est censée faire?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut
    Je me suis aperçu que si je n'initialisais pas un *text, mon Postgres renvoyait une valeur vide sans erreurs. J'ai réduit l'exemple de beaucoup pour que ça soit clair (je ne vais pas vous donner un code de 100 lignes alors que l'erreur apparait sur seulement 5 ) mais il est vrai qu'en rajoutant :
    "newName = PG_GETARG_TEXT_P(0)", l'exemple aurait été un peu plus correct.

    Comme je l'ai dit, l'erreur n'apparaissait qu'en decommentant juste une déclaration( bizarre).
    Y aurait-il un soucis avec la pile? Des macros oubliées?

    Ce qui est aussi étrange, c'est que sur la doc de Postgres , ils utilisent un char ** sans soucis.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Le fait de commenter une déclaration de variable locale produit un décalage des autres variables dans la pile.
    Donc quand est confronté à un bug de non-initialisation de pointeur, ça peut changer complètement le résultat obtenu, et notamment planter alors que ça ne plantait pas avant.
    Ca ne veut pas dire que le bug porte sur exactement la variable qu'on ajoute ou qu'on enlève, mais que cette modification produit un effet de bord qui révèle le bug.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 77
    Par défaut
    Je suis d'accord avec le fait que les variables soient décalées dans la pile. Mais normalement on s'en fiche, c'est le probleme du compilo non?
    Je ne vois pas comment on peut avoir un effet de bord en déclarant juste des pointeurs statiquement. Ou bien il y a un truc qui m'echappe.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/12/2002, 22h23
  2. [GTK]PB Librairie GTK+ sous dev-c++
    Par wozzy dans le forum Dev-C++
    Réponses: 15
    Dernier message: 05/11/2002, 14h55
  3. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  4. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44
  5. compatibilité des librairies directX8
    Par Freakazoid dans le forum DirectX
    Réponses: 3
    Dernier message: 23/05/2002, 21h33

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