GlibC Double свободен или поврежден (fclose)

Я получил ошибку в моей программе C во время выполнения. Я нашел кое-что об ошибке «двойное бесплатное или коррупционное», но ничего подходящего.

Вот мой код:

void compute_crc32(const char* filename, unsigned long * destination)
{
  FILE* tmp_chunk = fopen(filename, "rb");
  printf("\n\t\t\tCalculating CRC...");
  fflush(stdout);
  Crc32_ComputeFile(tmp_chunk, destination);
  printf("\t[0x%08lX]", *destination);
  fflush(stdout);
  fclose(tmp_chunk);
  printf("\t[ OK ]");
  fflush(stdout);
}

Кажется,

fclose(tmp_chunk);

вызывает эту ошибку glibc:

*** glibc detected *** ./crc32: double free or corruption (out): 0x09ed86f0 ***

======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb763cee2]
/lib/i386-linux-gnu/libc.so.6(fclose+0x154)[0xb762c424]
./crc32[0x80498be]
./crc32[0x8049816]
./crc32[0x804919c]
./crc32[0x8049cc2]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75e04d3]
./crc32[0x8048961]

В выводе консоли отображается последняя CRC, но не последняя "[OK]"...

У меня никогда не было ошибок такого типа, и я часами искал в Google, но в моем случае ничего интересного... пожалуйста, помогите :)


Теперь у меня другая ошибка:

*** glibc detected *** ./xsplit: free(): invalid next size (normal): 0x095a66f0 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb7647ee2]
/lib/i386-linux-gnu/libc.so.6(fclose+0x154)[0xb7637424]
./xsplit[0x80497f7]
./xsplit[0x804919c]
./xsplit[0x8049cd6]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75eb4d3]
./xsplit[0x8048961]

Что за чертовщина ? Я потерялся... :(


person Mike Choko    schedule 07.01.2013    source источник
comment
У вас нет другого fclose в Crc32_ComputeFile? Это бы все объяснило.   -  person Anton Kovalenko    schedule 07.01.2013
comment
нет я это уже искал. Crc32_ComputeFile принимает указатель FILE на открытый файл и ссылку на unsigned long для выходной контрольной суммы CRC.   -  person Mike Choko    schedule 07.01.2013
comment
Я просто думаю, что слово out в ошибке glibc имеет смысл... Я кое-что проверю...   -  person Mike Choko    schedule 07.01.2013


Ответы (1)


*** glibc detected *** ./crc32: double free or corruption

Glibc сообщает вам, что вы испортили кучу.

Инструментами для обнаружения таких повреждений в Linux являются Valgrind и AddressSanitizer.

Скорее всего, любой из них сразу скажет вам, в чем ваша проблема.

person Employed Russian    schedule 08.01.2013
comment
Программа не вылетает при запуске через valgrind... не знаю почему :'( - person Mike Choko; 08.01.2013
comment
@MikeChoko не падает — все в порядке. Сообщает ли Valgrind об ошибках? - person Employed Russian; 08.01.2013