C++: la glibc détecté corrompu double liste chaînée: 0x08f8f148
Je suis en train d'écrire un programme qui doit analyser la variable d'environnement PATH à un séparateur ":". Tout semble fonctionner correctement jusqu'à ce que la fonction chop tente de retourner le tableau. J'ai ensuite recevoir le message d'erreur suivant: "glibc détecté ./un.out: corrompu double liste chaînée: 0x08f8f148". J'utilise les hacher également d'analyser la saisie de l'utilisateur et qu'il fonctionne correctement. Toute aide est grandement appréciée.
//Parse environment variable
char const* pPath = getenv("PATH");
if (pPath == NULL){;}
else{
string ePath(pPath);
envp = chop(ePath,':');
}
char **chop(string s, char c){
int i, j, k, len, words = 0;
len = s.length();
//determine # of words
for(i=0;i<len+1;i++){
if(s[i] == c || s[i] == '//Parse environment variable
char const* pPath = getenv("PATH");
if (pPath == NULL){;}
else{
string ePath(pPath);
envp = chop(ePath,':');
}
char **chop(string s, char c){
int i, j, k, len, words = 0;
len = s.length();
//determine # of words
for(i=0;i<len+1;i++){
if(s[i] == c || s[i] == '\0'){words++;}
}
char **array;
string x;
//allocate memory for char pointers
if((array=(char**)malloc((words+1)*sizeof(char*))) == NULL){return NULL;}
array[0] = &x[0];
i = 0; k = 0;
//split string on char c
for(j = 1; j < (words+1); j++,k++,i++){
//read in characters until delimiter
while (s[k] != c && s[k] != '\0'){
x[i] = s[k];
i++; k++;
}
x[i] = '\0';
array[j] = &x[i+1];
}
array[j] = 0;
return array;
}
'){words++;}
}
char **array;
string x;
//allocate memory for char pointers
if((array=(char**)malloc((words+1)*sizeof(char*))) == NULL){return NULL;}
array[0] = &x[0];
i = 0; k = 0;
//split string on char c
for(j = 1; j < (words+1); j++,k++,i++){
//read in characters until delimiter
while (s[k] != c && s[k] != '//Parse environment variable
char const* pPath = getenv("PATH");
if (pPath == NULL){;}
else{
string ePath(pPath);
envp = chop(ePath,':');
}
char **chop(string s, char c){
int i, j, k, len, words = 0;
len = s.length();
//determine # of words
for(i=0;i<len+1;i++){
if(s[i] == c || s[i] == '\0'){words++;}
}
char **array;
string x;
//allocate memory for char pointers
if((array=(char**)malloc((words+1)*sizeof(char*))) == NULL){return NULL;}
array[0] = &x[0];
i = 0; k = 0;
//split string on char c
for(j = 1; j < (words+1); j++,k++,i++){
//read in characters until delimiter
while (s[k] != c && s[k] != '\0'){
x[i] = s[k];
i++; k++;
}
x[i] = '\0';
array[j] = &x[i+1];
}
array[j] = 0;
return array;
}
'){
x[i] = s[k];
i++; k++;
}
x[i] = '//Parse environment variable
char const* pPath = getenv("PATH");
if (pPath == NULL){;}
else{
string ePath(pPath);
envp = chop(ePath,':');
}
char **chop(string s, char c){
int i, j, k, len, words = 0;
len = s.length();
//determine # of words
for(i=0;i<len+1;i++){
if(s[i] == c || s[i] == '\0'){words++;}
}
char **array;
string x;
//allocate memory for char pointers
if((array=(char**)malloc((words+1)*sizeof(char*))) == NULL){return NULL;}
array[0] = &x[0];
i = 0; k = 0;
//split string on char c
for(j = 1; j < (words+1); j++,k++,i++){
//read in characters until delimiter
while (s[k] != c && s[k] != '\0'){
x[i] = s[k];
i++; k++;
}
x[i] = '\0';
array[j] = &x[i+1];
}
array[j] = 0;
return array;
}
';
array[j] = &x[i+1];
}
array[j] = 0;
return array;
}
- L'erreur n'est pas dans le code que vous avez montré. Le plus vous êtes susceptible de supprimer deux fois la même chose.
- double possible de qu'est Ce qu'un glibc gratuit/malloc/realloc invalide suivant la taille de l'/pointeur non valide erreur et comment la corriger?
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas si vous avez remarqué ou pas, mais vous êtes la création d'un tableau de pointeurs vers des emplacements dans un
std::string
objetx
qui a la fonction locale. Dès que cette fonction retourne une valeur, ces pointeurs ne sont pas garantis pour être significatif, parce quex
sera détruit.Vous allouez de stockage persistant pour le tableau de pointeurs, haché mots, mais en omettant de s'assurer que ce qu'ils pointent à a une durée de vie plus longue que la fonction elle-même. Si vous faites référence à l'un de ces indicateurs qu'il aura un comportement indéfini, qui juste peut être la cause de votre liste liée à la corruption.
Même si elle n'est pas la cause de votre problème, c'est encore une erreur qui doit être corrigée. Il ressemble presque à vous adapter à une C-base de
chop (...)
fonction qui fonctionne surchar *
et l'a remplacé parstd::string
ne réalisant pas ce qui se passe quand un objet string est hors de portée.Je suis tombé sur cette erreur de code dans certains cas où quelqu'un a appeler exit() dans un thread, en même temps que
main()
retourné, provoquant global/constructeurs statiques à exécuter dans les deux threads.Cette erreur se manifeste aussi que la
double free or corruption
, une erreur de segmentation/sig11 à l'intérieur deexit()
ou à l'intérieur demalloc_consolidate
, et probablement d'autres.Le problème ne s'est jamais montré lors de l'exécution sous valgrind.