boost::spirit и segfault
Ведь построенный как надстройка над STL, он не может вытворять такие вещи как запись за пределы выделенной памяти?Еще как может.
Со spirit'ом не работал, но то что он написан на STL - ничего не гарантирует.
В принципе, да, но ведь весь буст построен на принципе, чтобы максимум что плохое было -- это исключение. А тут выход за пределы памяти, самым наглым образом. :/
Я его использую давно, никогда он не подводил, но в этом проекте почему-то вышла такая дрянь.
Таки всё ещё не факт, что это он, раньше ты на iconv грешил. Вот поймаешь конкретную строку, которая некорректна (советую поиграться efence + gdb и, всё-таки valgrind тогда да.
Вопрос в следующем: может ли boost::spirit в принципе быть глючным? Ведь построенный как надстройка над STL, он не может вытворять такие вещи как запись за пределы выделенной памяти? Или все-таки какой-либо идиотизм возможен?
Попробуй в качестве STL воспользоваться SafeSTL, может она на конкретную багу укажет.
А вообще, boost, по крайней мере местами, плохо написан. Смотрел я один кусок кода внимательно -- очень прикольно, как для форматированного вывода boost на лету формирует подходящую строку формата printf и этот самый printf вызывает. STL местами тоже сильно грешит. Кстати, и printf бывает некорректный -- под Solaris 9 (под 64-х битный Sparc) valgrind в printf'е нашёл, что при печати 32-х битного числа это число из стека читается как 64-х битное, соответственно -- доступ к неинициализированной (и потенциально не выделенной) памяти.
Оставить комментарий
Werdna
Ситуация следующая.Демон, изначально написанный на С, добавки -- на плюсах. Одна из добавок вызвала регулярные сегфолты, редко проявляющие себя.
Эта часть написана на stl + boost::spirit + iconv. Мой код там крайне прозрачен, и особенных вещей не делает, поэтому подозрений не вызывает.
После отрубания iconv-части проект перестал сегфолтится почему-то, но не надолго -- все-таки сегфолт появился, что напрочь сняло сомнения в том, что причина -- iconv. В итоге подозрение перешло на boost::spirit. Переписывание части, осонованной на boost::spirit дало кое-какой результат. Теперь если что -- подозревать останется std::string, что уже совсем нелепо.
В итоге эта часть постепенно становится написанной на Си, что не может не огорчать.
Вопрос в следующем: может ли boost::spirit в принципе быть глючным? Ведь построенный как надстройка над STL, он не может вытворять такие вещи как запись за пределы выделенной памяти? Или все-таки какой-либо идиотизм возможен?
Переписывание парсера с boost::spirit на чистый Си похоже избавило от сегфолтов, что решает проблему, но ставит под сомнение архитектуру spirit.
Кто-нибудь сталкивался сам со spirit, или может знакомые что писали с его использованием? Я его использую давно, никогда он не подводил, но в этом проекте почему-то вышла такая дрянь.