корень зла (программистское)
Dec. 1st, 2009 05:07 pmЛюбопытная попытка написать супер-оптимизированный HTTP request/response parser. Намерения самые добрые, но... мне кажется, в этом небольшом модуле я смог бы набрать материала на часовую лекцию о том, когда не надо оптимизировать и как не надо.
Даже проглядев его вскользь, я вижу несколько мест, где на первый взгляд очень эффективный подход на самом деле даст относительно медленный код, который легко можно улучшить; а также заодно и место, где есть потенциальный buffer overflow. Утверждение автора, что его модуль "...is nearly optimal in its use of CPU instructions", конечно, слишком оптимистично. Но главное - почти наверняка выбранная модель общения с клиентом, через колбэки, на практике приведет к большим потерям времени и эффективности, чем столь тщательно сынженированные ручные подгонки под названия HTTP-методов, или отсутствие malloc()-ов.
Меж тем проект, ради которого это затеяно, Node.js (быстрый V8-джаваскрипт на сервере), весьма интересен.
Даже проглядев его вскользь, я вижу несколько мест, где на первый взгляд очень эффективный подход на самом деле даст относительно медленный код, который легко можно улучшить; а также заодно и место, где есть потенциальный buffer overflow. Утверждение автора, что его модуль "...is nearly optimal in its use of CPU instructions", конечно, слишком оптимистично. Но главное - почти наверняка выбранная модель общения с клиентом, через колбэки, на практике приведет к большим потерям времени и эффективности, чем столь тщательно сынженированные ручные подгонки под названия HTTP-методов, или отсутствие malloc()-ов.
Меж тем проект, ради которого это затеяно, Node.js (быстрый V8-джаваскрипт на сервере), весьма интересен.
no subject
Date: 2009-12-01 03:23 pm (UTC)no subject
Date: 2009-12-01 03:24 pm (UTC)no subject
Date: 2009-12-01 03:28 pm (UTC)no subject
Date: 2009-12-01 03:29 pm (UTC)"оптимальный" - опасное слово :)
no subject
Date: 2009-12-01 03:46 pm (UTC)Ну а в данном случае ragel лучше тем, что не нуждается в коллбэках - обработчик пишется просто инлайн. Хотя, конечно, и там boilerplate code нужно писать, так что тоже не идеал.
no subject
Date: 2009-12-01 03:48 pm (UTC)no subject
Date: 2009-12-01 04:01 pm (UTC)no subject
Date: 2009-12-01 04:02 pm (UTC)no subject
Date: 2009-12-01 04:07 pm (UTC)обратите внимание, что ch - char, а не unsigned char.
no subject
Date: 2009-12-01 04:11 pm (UTC)no subject
Date: 2009-12-01 04:12 pm (UTC)no subject
Date: 2009-12-01 04:14 pm (UTC)no subject
Date: 2009-12-01 04:16 pm (UTC)no subject
Date: 2009-12-01 04:45 pm (UTC)no subject
Date: 2009-12-01 05:33 pm (UTC)зависит от коллбэка. парсер думает, что проверяет, что header field состоит из законных символов (буквы, цифры, минус), но при этом пропускает символы <0. если коллбэк понадеется на эту проверку и со своей стороны станет индексировать этими символами какие-то свои массивы, может оказаться еще как exploitable.
no subject
Date: 2009-12-01 05:33 pm (UTC)no subject
Date: 2009-12-01 05:34 pm (UTC)no subject
Date: 2009-12-01 05:35 pm (UTC)no subject
Date: 2009-12-01 05:42 pm (UTC)the guy probably spent quite a bit of time working on that 8 bit HTTP parser...
no subject
Date: 2009-12-01 06:08 pm (UTC)Так там callbacks встраиваемые.
no subject
Date: 2009-12-01 06:13 pm (UTC)какое страшное слово
no subject
Date: 2009-12-01 06:19 pm (UTC)no subject
Date: 2009-12-01 06:31 pm (UTC)no subject
Date: 2009-12-01 06:37 pm (UTC)no subject
Date: 2009-12-01 06:39 pm (UTC)