?

Log in

баг в перле - Поклонник деепричастий [entries|archive|friends|userinfo]
Anatoly Vorobey

[ website | Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Links
[Links:| English-language weblog ]

баг в перле [фев. 19, 2003|11:16 am]
Anatoly Vorobey
[Настроение |curiouscurious]

(эта запись будет интересна, наверное, только программистам, знающим Perl)

Благодаря ЖЖ найден небольшой баг в Перле, в обработке некоторых регулярных выражений.


Точнее, благодаря DeadJournal'у, на серверах которого он проявился. В самом ЖЖ этот код не бежит, т.к. это проверка валидности UTF8-строки, которая запускается, только если не включена инлайновая версия на C, а у нас она включена.

Собственно, все подробности здесь.

Сейчас думаю поиграться с исходниками Перла немножко, посидеть в gdb (давненько я не сидел в gdb!), и, может быть, исправить баг в самом Перле. Если за несколько часов не сдастся, напишу перлятам, пусть они сами разбираются.
СсылкаОтветить

Comments:
From: graycrow
2003-02-19 01:36 am
Анатолий, у вас опечатка — ссылка на DeadJournal ведет на ЖЖ. Воистину добро побеждает зло :)
(Ответить) (Thread)
[User Picture]From: avva
2003-02-19 01:39 am
Ой :)
Спасибо, исправил.
(Ответить) (Parent) (Thread)
[User Picture]From: kukutz
2003-02-19 02:28 am
Анатолий, а вдруг это не баг? :-)

Поглядите вот сюда, плз: http://bugs.php.net/?id=20698
(Ответить) (Thread)
[User Picture]From: kukutz
2003-02-19 02:31 am
Я детально не смотрел суть бага в перле, но он показался мне похожим на найденный мной "баг" в php.

Суть в том, что если matches слишком много, то PCRE падает. Но виновата не PCRE (хотя могла бы и не падать), а те, кто пишут регекспы, которые матчат слишком много матчей, грубо говоря.
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2003-02-19 04:25 am

Re:

Интерпретатор языка не должен падать в любом случае. Это как бы аксиома :) если регексп слишком тяжёлый, PCRE должна вернуть ошибку, а не переполнить стэк; а если переполняет, то это баг. Так мне кажется.

Ответ PHP-шных девелоперов на Ваш баг мне кажется, откровенно говоря, глупым.

Я сейчас копаюсь в недрах перловской библиотеки регекспов, и там есть поддержка избежания бесконечной рекурсии и прочих подобных прелестей, но почему-то она не срабатывает.
(Ответить) (Parent) (Thread)
[User Picture]From: kukutz
2003-02-19 08:07 am
Не то чтобы очень глупым, PCRE-то не они пишут. Но по сути ты прав, конечно.

О результатах расскажешь?
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2003-02-19 08:13 am

Re:

Следи за ссылкой на Зиллу, я уже туда заслал немного результатов. Скоро ещё будет.

Что касается твоего конкретного случая с PHP и PCRE: попробуй вместо (\n|?) использовать
(?:\n|?) и скажи мне, предотвращает ли это крэш :)
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2003-02-19 08:14 am
Вернее,
(?:\n|.)* вместо (\n|.)* .
(Ответить) (Parent) (Thread)
[User Picture]From: avva
2003-02-19 02:35 am

Re:

Интересно, спасибо. Но я не убеждён. Столь простой regexp, как в том примере, в Перле не приводит к крэшу; более того, небольшое варьирование перловского regexp'а приводит к нормальной работе. Так что я подозреваю, что может быть баг в компиляторе regexp'ов.
(Ответить) (Parent) (Thread)