2012-10-09 3 views
0

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.

+1

Obtenez-vous un segfault? Ou une double erreur de corruption libre/tas spécifiquement? – PherricOxide

+1

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. –

+2

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? –

Répondre

1

Je suppose que str a déjà été libéré par free(tmpstr); - s'il vous plaît jeter un oeil sur le comportement de la fonction urlencode. Il semble qu'il ne génère pas de nouvelle chaîne comme valeur de retour, mais renvoie la chaîne d'entrée (modifiée).

+2

Non, ce n'est pas ça, c'est 'buoc' de malloc et ça revient. –

0

le problème s'est avéré être un problème avec le calcul de la taille pour le malloc initial de str étant exécuté comme 0. Merci pour les commentaires, malheureusement aucun moyen de vraiment marquer une réponse en tant que commentaires.

Si c'est une manière incorrecte de fermer ceci, s'il vous plaît faites le moi savoir.

+1

Je pense que vous pouvez supprimer la question. À l'avenir, publiez votre code réel ou vérifiez que l'exemple de code souffre réellement du même problème (si ce n'est pas le cas, la différence peut vous conduire à la solution). – ugoren