La compréhension de “corrompu taille et prev_size” glibc erreur

J'ai mis en place un JNA pont de FDK-AAC. Le code Source peut être trouvé dans ici

Lorsque le bench-marking mon code, je peux faire des centaines de succès s'exécute sur la même entrée, et puis à l'occasion d'un C-niveau de l'accident qui va tuer l'ensemble du processus, ce qui entraîne un core dump être généré:

En regardant le vidage du noyau, il ressemble à ceci:

#1  0x00007f3e92e00f5d in __GI_abort () at abort.c:90
#2  0x00007f3e92e4928d in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7f3e92f70528 "*** Error in `%s': %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:181
#3  0x00007f3e92e5064a in malloc_printerr (action=<optimized out>, str=0x7f3e92f6cdee "corrupted size vs. prev_size", ptr=<optimized out>, ar_ptr=<optimized out>) at malloc.c:5426
#4  0x00007f3e92e5304a in _int_free (av=0x7f3de0000020, p=<optimized out>, have_lock=0) at malloc.c:4337
#5  0x00007f3e92e5744e in __GI___libc_free (mem=<optimized out>) at malloc.c:3145
#6  0x00007f3e113921e9 in FDKfree (ptr=0x7f3de009df60) at libSYS/src/genericStds.cpp:233
#7  0x00007f3e1130d7d3 in Free_AacEncoder (p=0x7f3de0115740) at libAACenc/src/aacenc_lib.cpp:407
#8  0x00007f3e1130fbb3 in aacEncClose (phAacEncoder=0x7f3de0115740) at libAACenc/src/aacenc_lib.cpp:1395

Ce retour/trace de la pile d'erreur est reproductible si je lance répéter de référence suffisamment de fois , mais je vais avoir un moment difficile la compréhension de ce que pourrait être la cause de cette erreur? La mémoire allouée à pointeur 0x7f3de009df60 est allouée à l'intérieur de la RPC/C le code et je peux garantir que la même instance qui est alloué est libéré. L'indice de référence est, bien sûr - single-threaded.

Après la lecture de ces:

les contrôles de sécurité &&
fonctions internes

Je suis encore avoir du mal à comprendre - ce qui pourrait être un réel (non-exploitation, mais plutôt d'erreur)) scénario qui m'amène à obtenir l'erreur ci-dessus? et pourquoi faut-il se produire très peu?

Actuel de suspicion:

À effectuer un backtrace, je reçois cette entrée:

#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
set = {__val = {4, 6378670679680, 645636045657660056, 90523359816, 139904561311072, 292199584, 139903730612120, 139903730611784, 139904561311088, 1460617926600, 47573685816, 4119199860131166208, 
139904593745464, 139904553224483, 139904561311136, 288245657}}
pid = <optimized out>
tid = <optimized out>
#1  0x00007f3e92e00f5d in __GI_abort () at abort.c:90
save_stage = 2
act = {__sigaction_handler = {sa_handler = 0x7f3de026db10, sa_sigaction = 0x7f3de026db10}, sa_mask = {__val = {139903730540556, 19, 30064771092, 812522497172832284, 139903728706672, 1887866374039011357, 
139900298780168, 3775732748407067896, 763430436865, 35180077121538, 4119199860131166208, 139904561311552, 139904553065676, 1, 139904561311584, 139904561312192}}, sa_flags = 4096, 
sa_restorer = 0x14}
sigs = {__val = {32, 0 <repeats 15 times>}}
#2  0x00007f3e92e4928d in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7f3e92f70528 "*** Error in `%s': %s: 0x%s ***\n") at ../sysdeps/posix/libc_fatal.c:181
ap = {{gp_offset = 40, fp_offset = 32574, overflow_arg_area = 0x7f3e11adf1d0, reg_save_area = 0x7f3e11adf160}}
fd = <optimized out>
list = <optimized out>
nlist = <optimized out>
cp = <optimized out>
written = <optimized out>
#3  0x00007f3e92e5064a in malloc_printerr (action=<optimized out>, str=0x7f3e92f6cdee "corrupted size vs. prev_size", ptr=<optimized out>, ar_ptr=<optimized out>) at malloc.c:5426
buf = "00007f3de009e9f0"
cp = <optimized out>
ar_ptr = <optimized out>
ptr = <optimized out>
str = 0x7f3e92f6cdee "corrupted size vs. prev_size"
action = <optimized out>
#4  0x00007f3e92e5304a in _int_free (av=0x7f3de0000020, p=<optimized out>, have_lock=0) at malloc.c:4337
size = 2720
fb = <optimized out>
nextchunk = 0x7f3de009e9f0
nextsize = 736
nextinuse = <optimized out>
prevsize = <optimized out>
bck = <optimized out>
fwd = <optimized out>
errstr = 0x0
locked = <optimized out>
#5  0x00007f3e92e5744e in __GI___libc_free (mem=<optimized out>) at malloc.c:3145
ar_ptr = <optimized out>
p = <optimized out>
hook = <optimized out>
#6  0x00007f3e113921e9 in FDKfree (ptr=0x7f3de009df60) at libSYS/src/genericStds.cpp:233
No locals.
#7  0x00007f3e1130d7d3 in Free_AacEncoder (p=0x7f3de0115740) at libAACenc/src/aacenc_lib.cpp:407
No locals.
#8  0x00007f3e1130fbb3 in aacEncClose (phAacEncoder=0x7f3de0115740) at libAACenc/src/aacenc_lib.cpp:1395
hAacEncoder = 0x7f3de009df60
err = AACENC_OK
  • Dans le cadre #6, vous pouvez voir le pointeur en question est 0x7f3de009df60.
  • Dans le cadre #4, vous pouvez voir que la taille est 2720, qui est en effet la taille attendue de la structure d'être libéré.
  • Cependant l'adresse de nextchunk est 0x7f3de009e9f0, qui est à seulement 2704 octets après le pointeur courant qui est publié.
  • Je peux confirmer que c'est toujours le cas lorsque l'erreur se reproduit.
  • Cela pourrait être une forte indication de l'erreur que je suis face ??
  • Je vous recommande de prendre un peu de recul, et la construction d'un un minimum de reproductibles exemple pour trouver la gestion de la mémoire bug dans votre code. Alors qu'il n'est pas impossible que l'analyse des adresses révèle le problème, ce bas-niveau pitreries devrait être un dernier recours, en particulier compte tenu de la probabilité que votre programme a UB (et que, par conséquent, ces adresses ne peuvent même pas être digne de confiance). De toute façon, sans une telle MCVE, nous ne serons pas de débogage ici....
  • Utiliser valgrind ou de l'Adresse de Désinfectant.
  • je vous remercie pour votre réponse détaillée. Comme la génération d'un MCVE serait assez difficile (encore une fois, cette erreur n'est pas toujours reproductible), peut-être que nous devrions commencer par une question plus simple - en ce qui concerne la pratique de la compréhension de l'erreur "corrompu taille et prev_size" - avez-vous une idée de ce qui aurait pu déclencher cette erreur dans un programme?
  • Oui, la génération de MCVEs est dur, mais rien ne vaut de faire est jamais facile. C'est le travail que vous avez à faire. Le débogage est la première étape. J'ai pleinement conscience que c'est tentant d'essayer de sauter cette étape en revenant plus des lignes directrices générales, mais ce n'est tout simplement pas pratique jusqu'à ce que vous avez repéré sur le problème. Bonne chance!
InformationsquelleAutor Sheinbergon | 2018-04-03