значит такая функция:
int BDwrToNewFile (class BD * bd, char * name) {
...
printf ("End of BDwrToNewFile!!!\n");
return num;
}
вот так вызывается:
answer = BDwrToNewFile (database, filename);
printf ("droptf ...\n");
результат запуска:
End of BDwrToNewFile!!!
*** stack smashing detected ***: ./main2 terminated
Аварийный останов (сделан дамп памяти)
как видно, сообщение перед выходом из функции выходит, а после возврата - нет.
ассемблерных вставок нет, динамическую память функция не выделяет, потоки не создает (хотя вообще в программе поток не один и функцию вызывает не главный поток, но явным образом это никак имхо не должно затрагивать данный кусок программы), при компиляции ключ -D_REENTRANT используется.
как понять в чем трабл?
UPDATE: методом закомментирования найдено место, а именно: если данные скопировать в юнион и потом fwrite-ом их из юниона записывать, то крэшится (не во время записи, а после выхода из функции, внутри которой вызывался fwrite), если ничего не менять кроме того, откуда писать, то нет, как такое возможно o_O
Собственно сам вызов fwrite:
if (fwrite(nf.array /*(char *)&(node->record)*/, nf_size, 1, out) != 1) {
fprintf (stdout, "Write error: %d of %d\n", num, 1);
fclose(out);
BD_stats::errflags |= (1<<19);
return num;
}
если так, как написанно, то крэш, если то, что закоментированно раскомментировать, то нет.
nf - юнион, bdnf и node->record имеют одинаковый тип
union BD_nf {
struct BD_node_fields bdnf;
char array[sizeof(struct BD_node_fields)];
};
Пользователь решил продолжить мысль 11 Марта 2014, 23:52:54:
может кому поможет, кто окажется в похожей ситуации ...
в общем переписаны все операции с памятью через memcpy и заработало, я правда так и не вижу никакой логической связи, до этого использовался strcpy, до вызова fwrite