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 :

Retour de pointeur


Sujet :

C

Vue hybride

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 215
    Par défaut Retour de pointeur
    Bonjour,

    Dans le cadre du développement d'une extension PHP (écrit en C), je me retrouve dans le cas 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
    24
    25
    26
    27
    28
    const char * phpgit_working_directory_get_branch(git_repository *repo, int format) {
        int error = 0;
        const char *branch = NULL;
        git_reference *head = NULL;
     
        /* Je pense que le code suivant n'est pas déterminant du problème, mais comme je suis un noob en C, je le laisse au cas où */
        error = git_repository_head(&head, repo);
     
        if (error == GIT_EUNBORNBRANCH || error == GIT_ENOTFOUND) {
            zend_throw_exception("Exception", "Branch not found", 404);
        } else if (!error) {
            branch = git_reference_shorthand(head);
        } else {
            zend_throw_exception("Exception", "Failed to get current branch", 500);
        }
     
        if (!branch) {
            if (format == FORMAT_LONG) {
                zend_throw_exception("Exception", "Not currently on any branch", 0);
            } else {
                zend_throw_exception("Exception", "HEAD (no branch)", 1);
            }
        }
     
        /* et on retourne branch, qui est un pointeur NULL, ou un pointeur "valide" définit par git_reference_shorthand, qui renvoi "const char *" ( https://libgit2.github.com/libgit2/#v0.23.2/group/reference/git_reference_shorthand )   */
     
        return branch;
    }
    Cette fonction, phpgit_working_directory_get_branch, est appelée par 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
    18
    19
    20
    PHP_METHOD(WorkingDirectory, getBranch)
    {
        php_working_directory_t *wd;
        git_repository *repo;
        const char *branch;
        zend_string zbranch;
     
        wd = PHP_GIT_WORKING_DIRECTORY_FETCH_FROM(Z_OBJ_P(getThis()));
        repo = wd->repo;
     
        /* La ligne à problème */
        branch = phpgit_working_directory_get_branch(repo, FORMAT_SHORT);
     
        if(branch != NULL) {
            zbranch = zend_string_init(branch, strlen(branch), 0);
            RETURN_STR(zbranch);
        } else {
            RETURN_FALSE();
        }
    }
    En l'état, je prends un warning :
    warning: assignment makes pointer from integer without a cast
    Si je cast :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    branch = (const char *) phpgit_working_directory_get_branch(repo, FORMAT_SHORT);
    Je prends un autre warning :
    warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]

    Du coup j'ai deux questions :

    1. Pourquoi j'ai besoin de caster un type en un type exactement identique : const char* en const char* ?
    2. Mes recherches sur le 2e warning m'amène à penser que phpgit_working_directory_get_branch me retourne en fait un int (typiquement l'adresse vers laquelle pointe ma variable branch, mais du coup je en comprends pas pourquoi) et que il essai de caster cet int en pointeur à nouveau, et que ça lui pose un problème, et la non plus je ne comprends pas pourquoi car cet int d'adresse aurait la même taille puisqu'il vient d'un pointeur, casté en pointeur, sauf que le warning dit que j'ai tord. Du coup je suis perdu, d'où mon message

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 872
    Par défaut
    Oula, si le int représente un pointeur, c'est vraiment très moche et très dangereux (si l'adresse du pointeur est en 64 bits alors que ton int est en 32, ça va poser souci). Si tu es absolument sûr que c'est bien un pointeur qui est renvoyé, je crains que tu ne puisses pas faire grand chose d'autre que d'ignorer le warning.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 215
    Par défaut
    Oula, si le int représente un pointeur, c'est vraiment très moche et très dangereux
    Je suis bien d'accord.
    Le prototype de la fonction est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char * phpgit_working_directory_get_branch(git_repository *repo, int format);
    Si autre chose qu'un pointeur vers un "const char" était renvoyé, j'aurais une erreur dès la compilation non ?
    Ca me ramène au premier warning :

    warning: assignment makes pointer from integer without a cast
    Il me dit que je reçois un int non ?

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Il n'y aurait pas, par hasard, une erreur dans le prototype ou la définition de la fonction?
    Est-ce que l'en-tête et le .c définissant la fonction annonce bien const char*?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 215
    Par défaut
    Pas d'autre message d'erreur avant.

    Effectivement je me suis emmêlé avec les h et les protos, j'avais commenté le proto de `phpgit_working_directory_get_branch` dans le h, du coup il y avait déclaration implicite, d'où le warning !
    Maintenant j'ai plein de nouvelles erreurs

    Super, merci les gars

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Ça montre que ton GCC est mal configuré, comme c'était justement mon cas: Bien configuré, il devrait te donner un warning sur la "déclaration implicite"!
    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.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Ça, ça ressemble au problème typique de manque de warning sur l'usage d'une fonction non-déclarée (je me suis déjà brûlé sur GCC avec ça).

    Assure-toi donc que la fonction phpgit_working_directory_get_branch() est bien déclarée correctement là où tu l'utilises.
    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.

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

Discussions similaires

  1. fonction retourant un pointeur
    Par Seabast888 dans le forum Débuter
    Réponses: 8
    Dernier message: 01/12/2009, 12h03
  2. Réponses: 11
    Dernier message: 07/01/2008, 19h47
  3. retour de pointeur par une fonction
    Par Miko95 dans le forum C++
    Réponses: 17
    Dernier message: 12/12/2007, 01h33
  4. Réponses: 3
    Dernier message: 29/04/2007, 12h31
  5. Retour d'un pointeur const
    Par olive_le_malin dans le forum C++
    Réponses: 15
    Dernier message: 05/03/2007, 22h37

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