Psudo code ci-dessous, mais est-ce que quelqu'un a une idée pourquoi ce serait casser le tas? La fonction urlencode est une fonction de bibliothèque standard téléchargée ailleurs, et semble fonctionner comme prévu. Dans le code actuel, j'utilise des tableaux dynamiques de taille char, donc la raison de l'exigence de malloc dans main.Passant char pour casser des tas de tas
/* Returns a url-encoded version of str */
/* IMPORTANT: be sure to free() the returned string after use */
char *urlencode(char *str) {
//char *pstr = str, *buf = malloc(strlen(str) * 3 + 1), *pbuf = buf;
char *pstr = str, *buf = malloc(strlen(str) * 3 + 1), *pbuf = buf;
while (*pstr) {
if (isalnum(*pstr) || *pstr == '-' || *pstr == '_' || *pstr == '.' || *pstr == '~')
*pbuf++ = *pstr;
else if (*pstr == ' ')
*pbuf++ = '+';
else
*pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
pstr++;
}
*pbuf = '\0';
return buf;
}
int testFunction(char *str) {
char *tmpstr;
tmpstr = urlencode(str);
// Now we do a bunch of stuff
// that doesn't use str
free(tmpstr);
return 0;
// At the end of the function,
// the debugger shows str equal
// to "This is a test"
}
int main() {
char *str = NULL;
str = malloc(100);
strcpy(str, "This is a test");
testFunction(str);
free(str); // Debugger shows correct value for str, but "free" breaks the heap
return 0;
}
Merci.
Obtenez-vous un segfault? Ou une double erreur de corruption libre/tas spécifiquement? – PherricOxide
Aucun problème ici, mais si vous avez 'char's en dehors de la plage ASCII,' to_hex (* pstr >> 4) 'pourrait causer des problèmes, il est plus sûr de masquer cela avec' 0xF' aussi. –
Fonctionne bien pour moi, et Valgrind ne produit aucune erreur. Etes-vous sûr que le code dans '// Maintenant nous faisons un tas de choses qui n'utilisent pas str 'ne pas corrompre le tas? Avez-vous essayé de l'utiliser sous Valgrind? –