Somme de contrôle incorrecte pour objet libéré sur le malloc

- Je obtenir une

malloc: *** error for object 0x1001012f8: incorrect checksum for freed object
        - object was probably modified after being freed.
        *** set a breakpoint in malloc_error_break to debug

erreur dans la fonction suivante:

char* substr(const char* source, const char* start, const char* end) {
    char *path_start, *path_end, *path;

    int path_len, needle_len = strlen(start);

    path_start = strcasestr(source, start);
    if (path_start != NULL) {
        path_start += needle_len;
        path_end = strcasestr(path_start, end);
        path_len = path_end - path_start;
        path = malloc(path_len + 1);
        strncpy(path, path_start, path_len);
        path[path_len] = '
char* substr(const char* source, const char* start, const char* end) {
char *path_start, *path_end, *path;
int path_len, needle_len = strlen(start);
path_start = strcasestr(source, start);
if (path_start != NULL) {
path_start += needle_len;
path_end = strcasestr(path_start, end);
path_len = path_end - path_start;
path = malloc(path_len + 1);
strncpy(path, path_start, path_len);
path[path_len] = '\0';
} else {
path = NULL;
}
return path;
}
'
; } else { path = NULL; } return path; }

Comment puis-je faire ce travail? Quand j'ai réécrire la fonction d'allouer de la mémoire à l'aide de path[path_len + 1] il fonctionne très bien.

Maintenant, la partie que je ne comprends pas, c'est que je n'ai même jamais appel free en tout point à ma demande, comme toute mémoire allouée est nécessaire pour le programme jusqu'à ce qu'il existe (ce qui, autant que je sache, entraînera la nullité de toute la mémoire allouée de toute façon?!)

Alors, comment un objet libéré être endommagé si je n'ai jamais libre?

La fonction est appelée dans celui-ci:

char *read_response(int sock) {
    int bytes_read;
    char *buf = (char*)malloc(BUF_SIZE);
    char *cur_position = buf;

    while ((bytes_read = read(sock, cur_position, BUF_SIZE)) > 0) {
        cur_position += bytes_read;
        buf = realloc(buf, sizeof(buf) + BUF_SIZE);
    }

    int status = atoi(substr(buf, "HTTP/1.0 ", " "));

Il est le realloc, suis-je à l'aide de ce mal? Je veux lire l'intégralité de la réponse du serveur, j'ai donc réaffecter après chaque itération, n'est-ce pas?

Je ne vois pas free() n'importe où dans le code.
L'erreur est suggérer que vous foiré le tas par la modification d'une variable après la libération, mais cela ne veut pas dire que c'est la façon dont vous l'avez fait. Ce que vous faites est de gâcher le tas.
Est-ce que votre programme d'appels realloc?
Alors que ce n'est pas lié à l'erreur, vous êtes encore abuser de strncpy. Si vous savez exactement combien de caractères vous avez besoin de copier, utiliser memcpy ou une sorte de strlcpy au moins. strncpy est complètement hors de propos ici, même s'il "fonctionne".
Je vois un realloc(). Ce qui compte comme un free().

OriginalL'auteur Florian Peschka | 2012-07-12