N'est pas pile d, malloc d or (récemment) libre avais, lorsque toutes les variables est utilisé
Lorsque j'appelle cette fonction:
int within(struct key *node, int *value) {
int length = len(node);
if ((value <= node[length-1].data) && (value >= node[0].data)) //Problematic line
return 0;
else if (value > node[length-1].data)
return 1;
else if (value < node[0].data)
return -1;
}
Valgrind soulève ce message d'erreur:
Adresse 0x51f60a0 n'est pas pile d, malloc d or (récemment) libre avais
value
et node
variables ont des valeurs correctes. Toutes les variables est utilisé. Quel est le problème avec la gestion de la mémoire? S'il vous plaît, dites-moi, si le fragment n'est pas évident de la situation.
Éventuellement, votre
L'appelant peut fournir une valeur non valide pour
ou il pourrait être de retour 0.
avez-vous un compilateur erreurs/avertissements lors de la compilation de ce code?
vous avez raison, le problème est dans le stackoverflow.com/questions/3637079/...
len
fonction retourne une longueur plus longue que le tableau réel.L'appelant peut fournir une valeur non valide pour
node
.ou il pourrait être de retour 0.
avez-vous un compilateur erreurs/avertissements lors de la compilation de ce code?
vous avez raison, le problème est dans le stackoverflow.com/questions/3637079/...
OriginalL'auteur I159 | 2014-05-21
Vous devez vous connecter pour publier un commentaire.
Le message
Address 0x51f60a0 is not stack'd, malloc'd or (recently) free
est habituellement seulement une partie d'un plus grand Valgrind message d'erreur.Ces Valgrind messages d'erreur ressemble généralement à ceci:
ou
Comment lire ces messages d'erreur
La première partie du message indique ce qui s'est passé ("lecture Invalide de taille 4" signifie que vous avez essayé de lire à partir d'une adresse mémoire qui vous ne devriez pas accès), suivi par le retour de trace de l'endroit où l'erreur s'est produite.
Les traces sont suivis par les détails à propos de l'adresse mémoire où vous avez essayé d'accéder. Valgrind fait une supposition de ce que vous pourriez dire, par la recherche si l'adresse est:
Address 0x1002772ac is 4 bytes after a block of size 12 alloc'd
Address 0x4c1d170 is 16 bytes inside a block of size 24 free'd
Et ces messages sont ensuite suivie par une deuxième trace qui indique l'endroit où vous avez alloué ou de libérer la mémoire mentionné.
Mais le message
Address 0x51f60a0 is not stack'd, malloc'd or (recently) free'd
signifie que Valgrind ne pouvais pas deviner ce que vous vouliez faire. Vous avez essayé d'accéder à la mémoire à 0x51f60a0 mais que l'adresse n'a pas été récemment libérés, et n'est pas près de toute autre partie de la mémoire allouée. De sorte que vous pouvez être raisonnablement sûr que l'erreur dans ce cas n'est ni un dépassement de la mémoire tampon, ni est-il un use-after-free erreur.Comment déboguer les erreurs de ce type
Donc on peut supposer que 0x51f60a0 est plus ou moins "aléatoire" adresse mémoire. Je pense principalement de deux causes possibles à cela:
Use of uninitialised value
message d'erreur de ValgrindEn dehors de ces, il y a bien sûr toujours la possibilité que l'erreur est en fait un dépassement de la mémoire tampon ou use-after-free mais Valgrind a échoué à détecter.
Comment déboguer cette erreur dans votre programme
Je pense, une façon de réduire le problème serait de démarrer l'application en Valgrind avec GDB pour trouver ce que l'accès à la mémoire exactement les causes de l'erreur (
node
mauvais? Estnode[length-1]
mauvais? Estnode[0]
mauvais?). Alors de savoir comment la mauvaise valeur est là en premier lieu.OriginalL'auteur oliver
Votre comparaison(s) doit être
*value <= node[length-1].data
pas
value <= node[length-1].data
OIE, vous manque l'astérisque avant le
value
variable.valgrind
pourra se plaindre.IDk sur valgrind, mais c'est UB faire un pointeur de comparaison sur les deux pointeurs qui ne pointent pas vers le même objet, alors ce serait une chose utile à signaler.
Si c'est vraiment le problème, alors il y aurait des erreurs de compilation pour l'incompatibles comparer de
int *
etint
.OriginalL'auteur KevinDTimm
Je ne suis pas répondre à cette question spécifique.
Il a été un long temps depuis quelque réponse a été acceptée. Mais je veux ajouter que la cause de mon problème de "pas de pile d, malloc d or (récemment) libre d". J'espère que ce sera utile à quelqu'un, dirigé ici par un moteur de recherche comme moi.
Dans mon cas, j'ai alloué un tas de tableau
p
de taille 585. Mais ensuite, j'ai essayé d'accéder àp
dans la plage d'index de 733~1300. Et valgrind a juste montré ce message.ps: Si ce genre de "réponse" est inadéquate dans StackOverflow, s'il vous plaît laissez-moi savoir. Je veux juste être utile.
OriginalL'auteur duleshi