Пустая строка кода влияет на результат выполнения?

sverel

Новичок
Всем привет. Столкнулся с очень не понятной багой. Багу пофиксил, но откуда она взялась - не могу понять.

На локальной машине запущено 2 сайта на одинаковых движках. Вчера вдруг внезапно, один из них перестал работать: браузер стал сообщать "соединение было разорвано сервером". Нет никаких сообщений об ошибках и даже в апачевских error-log и access-log ничего не пишется.

Методом подстановки exit-a было установлено, что скрипт отваливается в этой функции дойдя до самой последней строки с return-ом:

PHP:
	function MakeComponentPath($componentName)
	{
		if(!CComponentEngine::CheckComponentName($componentName))
			return "";

		return "/".str_replace(":", "/", $componentName);
	}
А в последней строке вроде как и ломаться нечему?!

Решение оказалось удивительным. Если поставить пустую строку в любое место функции, то сайт начинает отлично работать. Я поставил пустую строку перед закрывающей фигур.скобкой:

PHP:
	function MakeComponentPath($componentName)
	{
		if(!CComponentEngine::CheckComponentName($componentName))
			return "";

		return "/".str_replace(":", "/", $componentName);

	}
Строка с комментарием тоже помогает. Да и вообще любые изменения в файле помогают.

Как это можно объяснить?
Первая мысль: ошибка php-парсера. Но днём ранее всё отлично работало, в выходные никто сайт не трогал и он вдруг внезапно перестал работать. Кроме того, есть ещё второй сайт с такой же функцией и она отлично отрабатывает без пустых строк. И ещё я пробовал переключать версию php 5.3.8 и 5.3.10 - безрезультатно. Значит, парсер не виновен.

Вторая мысль: проблема с железом; может быть в ОЗУ появились бэды? Запустил на ночь memtest - ошибок не найдено.

Идеи закончились. Что ещё это может быть?

Баг проявлялся на:
Win7x64
Apache 2.2.20
mod_php 5.3.8 и 5.3.10 with xDebug
Оба сайта на Битриксе. Ломающая функция находится в ядре битрикса.
 

sverel

Новичок
Нет ничего такого. Это девелоперский сервак. Там стоит xDebug и стандартные расширения gd, mysql, xslt, pdo_*, mbstring.

Кстати, более подробный анализ выявил, что бага устраняется не любым изменением файла. Было выявлено следующее поведение:

Оригинальное начало файла (не работающий)
PHP:
<?
class CComponentEngine
{
Убираю один ентен и начинает работать:
PHP:
<?
class CComponentEngine{
Добавляю пробел и работать перестаёт:
PHP:
<?
class CComponentEngine {
Таким образом, есть какая-то чёткая закономерность. Но с чем она связана - не понятно.
 

zerkms

TDD infected
Команда форума
Воспроизведи проблему на минимально возможном файле и выложи его сюда
 

sverel

Новичок
Попытался воспроизвести на рабочем ноуте с очень похожей конфигурацией ПО - не получается. Да и на первом компе до выходных тоже работало без проблем. На выходных только обновил php 5.3.10 и больше никакую конфигурацию не менял. Пробовал возвращать mod_php5.3.8 - как было до выходных и это не повлияло на багу.

Но на всякий файл в аттаче.
 

Вложения

itprog

Cruftsman
Была аналогичная проблема. В коде попадается какой то редкий символ и браузер отваливается. У меня проблема воспроизводится %)
 

sverel

Новичок
Почему этот редкий символ лечится добавлением пустой строки в любое место файла??? Причём я пробовал добавлять, а потом удалять делитом а не ctrl+z - бага остаётся.
Ещё я заметил такую закономерность:
В одно место добавляю пустую строку - работает. В другом месте удаляю пустую строку - перестаёт работать. Таким образом бага проявляется только на определённом количестве пустых строк. И ещё в этой математике учитываются пробелы (см. тест выше).
 

itprog

Cruftsman
Нет, я не прав. Дело не в скрипте, а если длина скрипта равна 4096 байтам, то пхп отваливается ;s
 

sverel

Новичок
если длина ответа равна 4096 байтам, то апач или пхп отваливается
Файл который я прислал - вообще ничего не выводит. В нём только определяется класс, но ничего не выполняется.
У меня на обоих тачках short_open_tag=On, но баг воспроизводится только на стационарном компе. На ноуте нет. Хотя на ноуте ещё не обновил php5.3.8
 

itprog

Cruftsman
Угу, на php 5.3.10 такое же поведение. присоединяюсь к вопросу.
В нём только определяется класс, но ничего не выполняется.
да, дело именно в размере файла 4096, если добавить символ, то он изменится на 4097 и все заработает.
 

sverel

Новичок
Новые подробности.
Этот же баг всплыл на ещё одном очень старом проекте. В этот раз отваливался файл размером 8192 байта.

Теперь страшно обновлять боевой сервак до 5.3.10
 

itprog

Cruftsman
Ярослав
не знаю.. php не крешится, просто сбрасывает соединение. Вообще забавно , это уже второй или третий баг, связанный с размером входных данных.
 

korpus

злой бобёр
sverel
Попробуй поотключать модули апача или модули у PHP. Может Debug виноват?
У меня похожая фигня была, но с инклюдами файлов и путями для них. Тоже баг какой-то, что не знал даже где копать. Это был сторонний сервер и я не силён в этом, поэтому не стал разбираться что там к чему.
 
Сверху