LINUX.ORG.RU

Debian крашит мою программу

 , , гейзенбаг


0

3

По мере написания парсера python сталкивался всё с новыми и новыми ошибками в процедуре восстановления парсера после ошибки. В который раз устранив все проблемы и дописав ещё пару тестов, принялся впиливать его в остальной проект - и обнаружил тривиальную ошибку в восстановлении после кода

def )foo()
  pass
Исправил, подумал - наконец-то всё... и напоследок решил распарсить что-нибудь абсолютно ошибочное, типа вот этой статьи на википедии в версии на печати. И boost::test, конечно же, указал на сегфолт.

Погоняв тест внимательнее, обнаружил, что крах возникает на слове

Debian
рядом со ссылкой источник [7]. Причём если его убрать (оставив всё остальное) или просто поставить перед ним
!432цеп
То всё работает.

В связи с этим возникло непонимание - как ловятся такие гейзенбаги, в принципе, есть ли общие рецепты, теория? В данном случае проблема не с памятью, потребляет 66кб на в точке вылета.

Устранил баг. Оказалось, в двух строчках размер текущего токена сохранялся в переменную типа signed char и, разумеется, жёстко обрезался.

Но всё же - как лоровцы ловят такие баги и проверяют работоспособность кода? Больше тестов, проверки всех возможных границ рантайме (с #ifdef конечно же) - вот что пока что использую я. Есть ли смысл поглядеть в сторону статического анализа или есть более хорошие практики?

quiet_readonly ★★★★
() автор топика
Ответ на: комментарий от quiet_readonly

Но всё же - как лоровцы ловят такие баги и проверяют работоспособность кода?

Хочется верить, что лоровцы не пишут велосипеды. Но, думаю, это далеко не так.

jessey
()
Ответ на: комментарий от anonymous

Неужели имеется язык с более богатым набором проверок? Или стиль других языков - фигачить лишь бы работало на 1 тестовом примере и на все проблемы ставить except: pass (или что там для ловли всех исключений)?

quiet_readonly ★★★★
() автор топика
Ответ на: комментарий от quiet_readonly

Оказалось, в двух строчках размер текущего токена сохранялся в переменную типа signed char и, разумеется, жёстко обрезался.

Но всё же - как лоровцы ловят такие баги

когда у меня будут ТАКИЕ баги, я пойду в дворники. Если возьмут, что вряд-ли...

drBatty ★★
()

Гейзенбаг - это баг, который невозможно воспроизвести, так что у тебя точно не гейзенбаг. Твой конкретный баг, анверное, ловится анализом грамматики.

P.S. зачем тебе парсер Python?

tailgunner ★★★★★
()

Да, и гейзенбаги чаще всего возникают от того, что дебажная версия на уровне ассемблера очень сильно отличается от релиза. Или ещё от неправильной синхронизации потоков.

nanoolinux ★★★★
()

valgrind, etc. По-моему, даже были тулзы для отловли integer overflow, как раз твой случай.

А вообще парсер и анализатор питона лучше писать на чём-нить более подходящим. На питоне или какой-нить bison (каюсь, не шупал).

true_admin ★★★★★
()
Ответ на: комментарий от nanoolinux

Пишу парсер для QtCreator, потому и восстановление после ошибок должно быть хорошим. В отличие от C++, в питоне нет точки с запятой и }, до которых можно глотать все токены в режиме паники. Есть токен NEWLINE, но в питоне должно быть неявное склеивание строк, если осталась незакрытая скобка ([{ - а я это как-то забыл учесть при восстановлении.

Гейзенбагом назвал зря конечно, но всё же проблема проявилась только на очень нездоровом тесте.

Использую не bison, но qlalr, но он только генерит таблицу LALR парсера и подставляет вместо $rule_number номер последнего описанного правила, остальное ручками; за valgrind спасибо, попробую применить, а то раньше его только как профайлер использовал ;(

quiet_readonly ★★★★
() автор топика

гейзенбаг

Я только про Шрединбаг слышал...

encyrtid ★★★★★
()

По мере написания парсера python

Но зачем, если можно взять готовый питонячий?

baverman ★★★
()
Ответ на: комментарий от quiet_readonly

Оказалось, в двух строчках размер текущего токена сохранялся в переменную типа signed char и, разумеется, жёстко обрезался.

А предупреждения компилятора для лохов?

Pavval ★★★★★
()
Ответ на: комментарий от quiet_readonly

как лоровцы ловят такие баги

для ловли багов вроде описанного полезно применять такие инструменты поиска ошибок, как глаза (в частности) и голова (в целом).

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.