The nasty bug
Пятница, поздний вечер. Все идет хорошо, ничто не предвещает беду. Внезапно Вам сообщают, что галерея на Вашем сайте не работает. Хотя ведь работала, черть подери!!! Судорожно смотришь в 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’;. Линк на доку.