Быдлокодеры хреновы :-(

Почему так трудно проверять входные данные?

Возился сейчас с расширением Memcache; после очередного изменения кода сервер ушёл в глухую защиту и отказался реагировать на внешние раздражители.

Лог Apache пестрил записями [error] child died with signal 11, в логах ядра было сказано, что было очень плохо:

[-]
View Code (Unknown Language)
Mar 27 07:20:02 snowboarding kernel: [501607.032560] php5[11934]: segfault at 7fc86965d190 ip 00007fc86965d190 sp 00007fc8689850e8 error 14 in libgpg-error.so.0.4.0[7fc86c916000+3000]
Mar 27 09:35:02 snowboarding kernel: [509707.070086] php5[870]: segfault at 7f58775f7190 ip 00007f58775f7190 sp 00007f587691f0e8 error 14 in librt-2.10.1.so[7f587b60e000+7000]

Причём PHP мог вызвать сегфолт в любой библиотеке, что придавало охоте на баг особую пикантность. К счастью, откат кода помог локализовать баг.

Ошибка сегментации вызывалась следующим кодом:

[-]
View Code PHP
    $this->memcache = new Memcache();
    $result = false;
    if (!empty($data['server'])) {
        foreach ($data['server'] as $x) {
            $result |= $this->memcache->addServer($x['h'], $x['p'], true, $x['w']);
        }
    }

Опытным путём было установлено, что когда $x['w'] (вероятность выбора данного сервера) равна нулю, PHP вылетал с ошибкой сегментации при первом же вызове Memcache::get() (кстати, при отрицательном значении веса выдаётся предупреждение и PHP остаётся жив). Не поленились разработчики проверить на отрицательное значение. Но почему проверку на ноль не реализовали? Могли бы хотя бы указать допустимый диапазон значений. Козлы :-(

Буду пробовать вместо расширение Memcached — надеюсь, что там есть нормальная проверка на ошибки.

Мораль наступающим на те же грабли: данные нужно проверять. А то результату можно не обрадоваться.

Update: bug report.

Автор: ; опубликовано в: PHP; метки: Memcache, Memcached, PHP, segfault, ошибка
27
Мар
2010

RSS Комментарии к статье «Быдлокодеры хреновы :-(» (5)  »

  1. Alex

    Как определил откуда валится php? У меня похожая ситуация – php уходит в segfault, но могу найти откуда…

    • Ну в моём случае всё просто: PHP стал сегфолтиться после замены одного куска кода другим.

      Если по-хорошему, нужно включить core dumps, установить отладочные символы, ждать, пока упадёт, затем натравить gdb на полученную корку и сделать backtrace.

  2. Maron

    Да, бывает из-за одной мелочи (которую надо найти иногда в нескольких сотнях кода) все проблемы. И самое сложное – отловить эту мелочь. А когда она не по твоей вине – то вообще караул. Руки оторвать хочется…

  3. Владимир

    Memcached действительно, на мой взгляд стабильней… Единственное, что для меня до сих пор остаётся загадкой, где close()??? А так ей очень доволен…

    • В смысле где close()?

      Делаете unset() переменной-экземпляру класса Memcached, вызовется деструктор класса и, если соединение не persistent, оно будет закрыто.

      Как-то так.

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Быдлокодеры хреновы :-(»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा