Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: очень странная ошибка  (Прочитано 600 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн dronte

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
очень странная ошибка
« : 11 Марта 2014, 17:16:04 »
значит такая функция:

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
« Последнее редактирование: 11 Марта 2014, 23:52:54 от dronte »

 

Страница сгенерирована за 0.015 секунд. Запросов: 21.