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 :

Dereference of undefined pointer value


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 63
    Points : 68
    Points
    68
    Par défaut Dereference of undefined pointer value
    Je programme sous xCode et quand je fais un analyse de mon code j'ai la mise en garde suivante: "Dereference of undefined pointer value".

    Cette erreur arrive à la ligne "A[r[i]][c[i]] = d[i];"
    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
    46
     
        // MALLOC, DO NOT FORGET TO FREE
        double* Y = malloc((N - 1) * sizeof(double));
        double* d = malloc((3 * N - 5) * sizeof(double));
        int* r = malloc((3 * N - 5) * sizeof(int));
        int* c = malloc((3 * N - 5) * sizeof(int));
        double** A = malloc((N - 1) * sizeof(double*));
        for (i = 0; i < N - 1; i++) {
            A[i] = malloc((N - 1) * sizeof(double));
        }
     
        for (i = 0; i < N - 1; i++) {
            for(j = 0; j < N - 1; j++) {
                A[i][j] = 0;
            }
        }
     
        // Fill d, r, c
        d[0] = 1 + a[1];
        r[0] = 0;
        c[0] = 0;
        for (i = 1; i < N - 1; i++) {
            d[i] = a[i + 1];
            r[i] = i;
            c[i] = 0;
        }
        for (i = N - 1; i < 2 * N - 3; i++) {
            d[i] = 1;
            r[i] = i - N + 2;
            c[i] = i - N + 2;
        }
        for (i = 2 * N - 3; i < 3 * N - 5; i++) {
            d[i] = -1;
            r[i] = i - 2 * N + 3;
            c[i] = i - 2 * N + 4;
        }
     
        // Fill Y
        for (i = 0; i < N - 1; i++) {
            Y[i] = b[i + 1] - a[i + 1] * b[0];
        }
     
        // Fill A
        for (i = 0; i < 3 * N - 5; i++) {
            A[r[i]][c[i]] = d[i];
        }
    Est-ce que cette mise en garder arrive car le compilateur n'arrive pas à déterminer les indices r[i] et c[i] et pense qu'ils peuvent sortir des bornes de A?

  2. #2
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonsoir,

    Si ton compilateur a peur que tu débordes au niveau de tes indices, alors je le plains ; le langage C n'est pas vraiment ce qu'on pourrait caractériser de sûr. Il y a bien les interfaces de vérification de C11, mais ce n'est plus vraiment dans le sujet, et c'est pour le moment plus un hack pour les hérétiques qu'une véritable fonctionnalité...

    Le problème me semble être plus pragmatique que ça. Prenons la ligne 19 par exemple : tu places la somme de a[1] et de 1 dans d[0]. Sauf que a[i] est une adresse, retournée un peu plus haut par malloc (ligne 9).

    Je ne suis pas sûr que tu comptes mélanger adresses et entiers dans une même opération ; dans le cas contraire, tu devrais t'inquiéter pour la portabilité de ton application. Les machines où les adresses sont des données complexes à multiples champs, ça s'utilise quotidiennement... Bref, il va falloir revoir les indexations de tes tableaux.

    Bonne soirée !
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 63
    Points : 68
    Points
    68
    Par défaut
    Merci pour ta réponse, mais c'est "A et non "a" qui est initialisé ligne 9. "a" pointe bien sur des doubles donc pas de problème au niveau de la l'affectation d[0] = 1 + a[1]. D'ailleurs mon code ne plante jamais. C'est juste que j'aimerais comprendre pourquoi j'ai ce warning quand j'utilise la fonction analyse du code.

  4. #4
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonsoir,

    Effectivement, désolé, au temps pour moi. Cependant, avec toute la mauvaise foi qui me caractérise, je ne pourrai que te conseiller d'éviter les identificateurs à un seul caractère, qui en plus ne diffèrent que par la casse... c'est terriblement difficile à relire (surtout quand on n'a pas les yeux en face des trous).

    Bonne soirée !
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    Ce n'est pas un warning du compilateur, mais de l'analyseur statique, nuance. Effectivement l'analyseur statique sort ici probablement un "faux positif". C'est un cas qui peut-être intéressant à soumettre http://clang-analyzer.llvm.org/filing_bugs.html
    (Après simplification, je pense que la moitié du code peut-être supprimée et toujours avoir le warning).

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2005
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 63
    Points : 68
    Points
    68
    Par défaut
    Merci!

    Sinon, comment tu simplifierais le code?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    Ben en enlevant les autres tableaux autant que possible, ainsi que tout le reste du code qui n'a rien à voir.

    Tu peux partir de là, puis encore simplifié en essayant d'enlever le tableau "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
     
    double** A = malloc((N - 1) * sizeof(double*));
        for (i = 0; i < N - 1; i++) {
            A[i] = malloc((N - 1) * sizeof(double));
        }
     
        for (i = 0; i < N - 1; i++) {
            for(j = 0; j < N - 1; j++) {
                A[i][j] = 0;
            }
        }
     
        r[0] = 0;
        c[0] = 0;
        for (i = 1; i < N - 1; i++) {
            r[i] = i;
            c[i] = 0;
        }
        for (i = N - 1; i < 2 * N - 3; i++) {
            r[i] = i - N + 2;
            c[i] = i - N + 2;
        }
        for (i = 2 * N - 3; i < 3 * N - 5; i++) {
            r[i] = i - 2 * N + 3;
            c[i] = i - 2 * N + 4;
        }
     
        for (i = 0; i < 3 * N - 5; i++) {
            A[r[i]][c[i]] = i;
        }

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

Discussions similaires

  1. Can't call method "mail" on an undefined value
    Par pausg dans le forum Modules
    Réponses: 5
    Dernier message: 18/07/2008, 17h14
  2. document.getElementById('livre').value retourne undefined!
    Par sara21 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 24/05/2007, 14h08
  3. Réponses: 1
    Dernier message: 17/01/2007, 17h10
  4. Can't call method "mail" on an undefined value
    Par hpalpha dans le forum Modules
    Réponses: 2
    Dernier message: 18/01/2006, 10h50
  5. value de radio button indéfinie (undefined)
    Par noinneh dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/12/2004, 12h25

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