Codebits
that rock!

Oct 26, 2012

The nasty bug

posted by varnie • Tags: phpShow comments

Пятница, поздний вечер. Все идет хорошо, ничто не предвещает беду. Внезапно Вам сообщают, что галерея на Вашем сайте не работает. Хотя ведь работала, черть подери!!! Судорожно смотришь в svn log, кто что делал за последние пол-дня. Хм, вроде бы чисто, никто не трогал галерею. Хотя…

В одном из базовых скриптов участвующих в формировании линков на AJAX-запросы для конкретной страницы видим:

switch ($alias) {
    //много много кейсов
    //...
    case 'galleryData':
        $link = '/gallery.php?action=galleryData';
    
    case 'fooBarCheck':
        $link = '/main/foobarcheck';
        break;

Кто-то похерил break у кейса ‘galleryData’ и теперь даже если $alias равен ‘galleryData’, исполнение пойдет далее и $link переприсвоится и станет ‘/main/foobarcheck’.

Повезло, что проблему так быстро выявили и пофиксили.

Занятно, что в новомодных языках, таких как Go эту проблему решили на корню: проход сквозь несколько веток свитча запрещен на уровне языка. Если же требуется такое поведение (что случается крайне редко), то нужно использовать ключевое слово fallthrough:

“In a switch statement, case labels do not fall through. You can make them fall through using the fallthrough keyword. This applies even to adjacent cases.”

В Perl же аналогичного поведения можно добиться используя явное указание ключевого слова next или же используя use Switch ‘fallthrough’;. Линк на доку.


blog comments powered by Disqus
Fork me on GitHub