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 :

déréférencement de pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut déréférencement de pointeurs
    Bonjour,

    je me retrouve confronté à un dilemne : est-ce que le code suivant est correcte ?
    Il passe sans soucis à la compilation, avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -ansi -pedantic -Wall -O2 essai.c
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct
    {
        int i;
        int j;
        char coucou[32];
    }toto;
     
    int essai_fun (toto *to1, toto *to2)
    {
        toto ti1 = *to1;
        toto ti2 = *to2;
     
        if ((&ti1 == NULL) || (&ti2 == NULL))
            return -1;
        else
            printf ("ok   ");
     
        return 0;
    }
     
     
    int main()
    {
        int return_code = 0;
        int i = 0;
        toto to1;
        toto to2;
     
        for (i = 0; i < 10000 ; i++)
        {
            return_code = essai_fun (&to1, &to2);
     
            if (return_code != 0)
            {
            printf ("ERROR");
            return EXIT_FAILURE;
            }
        }
     
        return EXIT_SUCCESS;
    }
    Je ne parle bien évidemment pas de son intérêt, mais en fait, ce qui me gène, c'est cette ligne là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        if ((&ti1 == NULL) || (&ti2 == NULL))
    J'ai un peu l'impression que c'est un comportement indéfini ou quelque chose dans le style, mais je n'arrive pas à comprendre clairement ce qui se passe, et pourquoi c'est faux.

    merci.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  2. #2
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 877
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 877
    Par défaut
    Ne vaudrait-il mieux pas tester d'abord la validité des pointeurs passés en paramètres à ta fonction essai_fun, avant de définir tes variables ti1 et t12 ?

    Je pense que ce serait plus logique.

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Moi je viens de tester la compilation sur Dev-cpp avec et pas de problèmes !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut Re: déréférencement de pointeurs

    Citation Envoyé par gangsoleil
    Je ne parle bien évidemment pas de son intérêt, mais en fait, ce qui me gène, c'est cette ligne là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((&ti1 == NULL) || (&ti2 == NULL))
    J'ai un peu l'impression que c'est un comportement indéfini
    Je dirai plutot une ligne inutile puisque ti1 et ti2 sont des variables automatiques donc leurs adresses ne peuvent être NULL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    toto ti1 = *to1;
    toto ti2 = *to2;
    Là tu copie les contenus, donc si tu as to1 ou to2 égale à NULL ça risque de mal se passer. Remis dans l'ordre, ça donne plutot ça :
    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
    int essai_fun (toto *to1, toto *to2)
    {
       toto ti1;
       toto ti2;
     
       if (to1 != NULL && to2 != NULL)
       {
          ti1 = *to1;
          ti2 = *to2;
       }
       else
       {
            return -1;
       }
     
        return 0;
    }

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: déréférencement de pointeurs
    Citation Envoyé par gangsoleil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int essai_fun (toto *to1, toto *to2)
    {
        toto ti1 = *to1;
        toto ti2 = *to2;
     
        if ((&ti1 == NULL) || (&ti2 == NULL))
            return -1;
        else
            printf ("ok   ");
     
        return 0;
    }
    Je ne parle bien évidemment pas de son intérêt, mais en fait, ce qui me gène, c'est cette ligne là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        if ((&ti1 == NULL) || (&ti2 == NULL))
    J'ai un peu l'impression que c'est un comportement indéfini ou quelque chose dans le style, mais je n'arrive pas à comprendre clairement ce qui se passe, et pourquoi c'est faux.
    Ce n'est pas faux, c'est plutôt que ça n'a aucun sens de tester si l'adresse d'une variable locale est nulle ou pas. Je pense que tu voulais faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int essai_fun (toto *to1, toto *to2)
    {
        if ((to1 == NULL) || (to2 == NULL))
            return -1;
        else
        {
            toto ti1 = *to1;
            toto ti2 = *to2;
            printf ("ok   ");
        }
        return 0;
    }
    ce que personnellement je code comme ça :
    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
     
    int essai_fun (toto *to1, toto *to2)
    {
        int err;
     
        if (to1 != NULL && to2 != NULL)
        {
            toto ti1 = *to1;
            toto ti2 = *to2;
            printf ("ok   ");
            err = 0;
        }
        else
        {
            err = -1;
        }
        return err;
    }

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Merci pour ces réponses.

    Effectivement, je suis bien d'accord avec vous, ce code n'a pas vraiment de sens, et les codes proposés sont bien meilleurs.

    Je me rends compte maintenant que l'erreur ne se situe pas à l'endroit où je croyais (sur le test à NULL des variables locales).

    Totuefois, mon problème est de savoir si ce code est succeptible, en l'état, de provoquer une erreur à un moment ou non.

    Par exemple, dans la fonction essai_fun, lorsuqe les paramètres sont déréférencés, que se passe-t-il si leur valeur est NULL ?

    PS : le code définitif est, normalement, bien meilleur que celui présenté ici.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par gangsoleil
    Totuefois, mon problème est de savoir si ce code est succeptible, en l'état, de provoquer une erreur à un moment ou non.
    Si to1 ou to2 vaut NULL le comportement sera indéfini sinon le code que tu présente ne comporte pas de risque

  8. #8
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Merci bien !
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 07/06/2010, 21h22
  2. déréférencement d'un pointeur de type incomplet
    Par ikuzar dans le forum Débuter
    Réponses: 1
    Dernier message: 07/09/2009, 18h37
  3. déréférencement d'un pointeur de type incomplet
    Par pauligno dans le forum Débuter
    Réponses: 8
    Dernier message: 10/12/2007, 10h50
  4. Réponses: 8
    Dernier message: 25/11/2007, 19h30
  5. Déréférencement d'un pointeur
    Par Acivurt dans le forum C
    Réponses: 23
    Dernier message: 29/07/2007, 11h51

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