2017-08-21 12 views
0

Je rencontre des problèmes avec cet extrait de code.Écriture incorrecte dans l'appel de realloc

size_t* defines = malloc(sizeof *defines); 
if (!defines) 
    exit(1); 

size_t def_cap = 1; 
size_t def_size = 0; 

... 

for(condition) { 
    ... 

    if (def_size == def_cap) { 
     void* tmp = realloc(defines, def_cap*=2); 
     if(!tmp) 
      exit(1); 
     defines = tmp; 
    } 
    defines[def_size++] = foo; 
} 

Je reçois un "malloc.c: 2842: mremap_chunk: Assertion` ((taille + offset) & (_rtld_global_ro._dl_pagesize - 1)) == 0' a échoué." erreur quand je cours. Valgrind me dit qu'il y a une écriture invalide de taille 8 dans l'appel de realloc. Que se passe-t-il? condition et foo font partie d'un désordre d'analyse de fichiers qui n'utilise ou ne modifie aucune des variables ci-dessus.

+1

-vous changer (incrément, par exemple) 'defines' quelque part? – tkausl

+1

Il semble que vous ayez corrompu les structures de données de segment en écrasant certaines plages de données en dehors de la zone allouée. Cela aurait pu se produire en raison d'un accès hors limite. Le code qui est dans le '...' est essentiel pour comprendre cela. –

+0

@tkausl Contrôle F dit non. – SonicN

Répondre

3

realloc prend un certain nombre d'octets, tout comme malloc, vous devez multiplier le nombre d'entrées par sizeof(size_t) comme avant:

def_cap *= 2; 
void* tmp = realloc(defines, def_cap * sizeof *defines);