Pull to refresh

Comments 62

А насколько оно эффективнее чем испектор кода в phpStorm?
Пардон за серость, но CI — это что? Дизамбиг в вики длинноватый.
Ошибка, обнаруженная ХипХопом — это гарантированно ошибка или просто предупреждение о возможной ошибке? Если первое, то верится с большим трудом (привет eval и иже). Если второе, то теряется смысл, потому что при ложном срабатывании будет или сломанный билд (при суровом подходе), или результат, набитый предупреждениями, на которые всем пофиг (если не сразу пофиг, то рано или поздно будет).
Надо пробовать, автор же писал, что пока ещё мало кто тестировал.
Насколько я помню, к ограничением хипхопа относится запрет на использование евала.

По поводу обнаруженных ошибок — и то и другое. Отсутствующий инклюд — это явная ошибка. Лишний параметр при вызове функции — возможная.

Сломанного билда не будет, поскольку тестирование делается перед коммитом.

Варнингов на [плохом] коде будет много, да. Расмус так и сказал — «кто хочет затроллить багтрекер любого опенсорс проекта, может натравливать анализатор хипхопа и писать тикеты десятками. „
Собственно, чтобы не было много предупреждений — нужно писать чистый код. И начинать тестировать его сразу, а не после того, как написано 100500 строк.
Скажем, во время презентации Расмус нашёл место в Вордпрессе, где в случае ошибки при fopen()… делался fclose()! И это очевидный говнокод.

Собственно, многие забывают, что куча варнингов “на которые всем пофиг» — это не проблема анализатора, это проблема кода.

Никогда не понимал подход игнорирования варнингов.
Да и вообще, сам факт написания такого кода.
У меня все нотисы/варнинги/ерроры всегда включены (отключаю только на финальной публикации) — и во-первых они вылазят крайне редко по ходу работы, во-вторых я их никогда не пропускаю.

Как же нужно наплевательски относиться к своему коду, что бы пропускать предупреджения?
У меня при разработке аналогично:
error_reporting => E_ALL (до PHP 5.4 было Е_ALL | E_STRICT)
xdebug.scream = 1 (отключает подавление ошибок при помощи @)

Да только люди разные: кто-то любит свою работу, кто-то лепит как попало лишь бы работало и от него отстали.
Многое еще зависит от того как на работе поставлен весь процесс разработки.
ну собаку я пользую в некоторых случаях для проверки, сериализована ли строка ( if ($tmp=@unserialize($str)) $str=$tmp; )
к сожалению, другого способа нет, а иногда такие проверки нужны
На продакшене display_errors => Off (только в лог) и нет xdebug :)

Что касается вашего примера, есть как минимум один случай, когда он не сработает.
Если сериализованая строка будет такой «b:0;»
Согласен. Но в тех случаях, в которых я использую такую проверку, такого не бывает)
Есть способ проверки и без собаки, но он завернутый (несколько проверок и регэкспы).
Если будет интересно, напишите в личку, завтра вышлю.
у нас вот такое используют:
function is_serialized($data)
{
// if it isn't a string, it isn't serialized
if (!is_string($data)) return false;
$data = trim($data);
if ('N;' == $data) return true;
if (!preg_match('/^([adObis]):/', $data, $badions)) return false;
switch ($badions[1]) {
case 'a':
case 'O':
case 's':
if (preg_match("/^{$badions[1]}:[0-9]+:.*[;}]\$/s", $data)) return true;
break;
case 'b':
case 'i':
case 'd':
if (preg_match("/^{$badions[1]}:[0-9.E-]+;\$/", $data)) return true;
break;
}
return false;
}
Вы допускаете очень распространённую ошибку, о которой я говорил на конференции:
Ставя собаку, РНР программист полагает, что ошибка бывает только одного типа.
Это неверно, и на этом заблуждении было потрачено впустую немало человеко-часов.

Для таких исключительных случаев лучше использовать исключения —
Ставить трай и отлавливать ошибку в кетче.
Ошибку ПРОВЕРЯТЬ, та ли это, которую мы ждём.
Если та — продолжаем выполнение программы.
Если нет — выбрасываем эту же ошибку снова, через trigger_error

Для этого надо переопределять error_handler, разумеется, но это и так везде сделано, мне кажется.

Разумеется, это не слишком красиво, и такой кривизны лучше избегать, меняя логику программы.
Скажем, сама проверка «сериализована ли строка» говорит о непродуманности логики программы. Хорошая программа всегда знает, какого рода данные ожидаются на вход.

Но в любом случае, ставя собаку всегда следует помнить, что ошибки бывают РАЗНЫЕ, а не только те, про которые мы знаем и которые ждём ;)
Некоторые программы имеют динамическую структуру данных. Ну, бывает такое)
Т.е. данные могут добавляться, меняться, типы данных могут быть разные, методы хранения и т.п.

Да, в идеализированном случае нужно хранить «манифест» (или как там такое по-модному называется), в котором это все будет описано и проверять по нему, но это не всегда целесообразно, т.к. часто приводит к существенным накладным расходам и к приличному усложнению логики. В общем, бывают частные случаи, где такой подход оправдан упрощением программы.

Что касается try/catch — ну да, соглашусь, правильнее это делать через него. Надо себя заставлять))))
1. Вы пропустили контекст.
Речь не о предупреждениях РНР, а об «ошибках, обнаруженных ХипХопом».
Я в комментарии ниже приводил слова Расмуса о том, что статический анализатор выполняет в 10 раз больше работы, чем обычный интерпретатор, и ошибки, которые он выдаёт, не отлавливаются обычным PHP. Это получается что-то вроде super-strict mode.
К примеру, Хипхоп отлавливает код, который никогда не выполняется, или передачу функции большего количества параметров, чем было объявлено. PHP на это не обращает внимания, а хипхоп — ругается.

2. Отключая ошибки «на финальной публикации» вы допускаете большую ошибку. На боевом сервере они нужны не меньше, чем на тестовом. Отключен должен быть только вывод на экран, разумеется. А сами «нотисы/варнинги/ерроры» должны быть включены так же как на тестовом — по максимуму, и писаться в лог.
1. Я ответил на вторую часть вашего сообщения)

2. Конечно же я имел ввиду вывод их на экран, а не отключение вовсе
UFO just landed and posted this here
Вы представляете себе процесс непрерывной интеграции?
Похоже, что не представляет.
UFO just landed and posted this here
Подскажите как запустить идею без иксов?
UFO just landed and posted this here
UFO just landed and posted this here
Стестняюсь спросить, а на production сервера тоже нужно иксы ставить?
Да, «например для работы с документами офисных форматов» :)
Угу, а для работы с документами графических форматов придётся ставить GIMP.
Вы серьезно предлагаете вместо выполнения нескольких консольных команд поднимать на сервере иксы, писать плагин для идеи, как-то интегрировать это все с CI, и в итоге запускать для каждого билда «монстра» в виде идеи?

Если да, то вопрос один: ЗАЧЕМ?
Кроме академического интереса.
UFO just landed and posted this here
CLI-альтернатива уже предложена.
Да и не альтернатива это: статический анализ PHP вообще не возможен, только динамический.
* нативного PHP, без трансляции в статические языки.
А зачем мне (да и вообще любому здравомыслящему админу) иксы на сервер CI?
Только ради phpStorma? o_O
Схема работы:

1. Коммиты в VCS.
2. На сервере стартовал билд.
3. Запустился Code Analyzer.
4. В случае найденных ошибок в коде билд упал, письма отправились, каждый девелопер при просмотре dashboard проекта видит информацию о ошибках.

Какая схема будет с использованием phpStorm?
UFO just landed and posted this here
Для меня это сродни забиванию гвоздей микроскопом.
Анализ такого уровня любая IDE поддерживает. Без Хип Хопа.
А чем ещё оно может быть интересно?
Тем, что не все используют IDE.
Вам следовало сказать, что это имеет смысл только вы транслируете код с помощью HipHop в C++.
A как вы себе по другому представляете статический анализ?

PHP Mess Detector, PHP_CodeSniffer, PHP Depend — это инструменты из другой оперы.
К тому же PHP_CodeSniffer — проверка форматирования, а не анализ как таковой.
Совершенно верно!

CodeSniffer отличная штука и мы его активно используем на сервере разработки, но я не понимаю, почему он должен конкурировать с программой, которая действительно компилит код PHP, а не просто смотрит на правильность его «текста».

То же относится и к предыдущим комментариям. Все приведённые инструменты прекрасны, но они о другом. Они смотрят просто на код и проверяют его на соответствие набору правил. HipHop делает из него C++ программу и смотрит, работает ли она так, как мы привыкли это видеть при компиляции неинтерпретируемого софта.
Строго говоря, компиляции там не происходит.
Расмус это подчеркнул — «на компиляцию ушло бы минут 20 на моём ноутбуке» — сказал он — «но статический анализ происходит так быстро, что его можно вешать на коммит».

Но смыслу сказанного вами это не противоречит: опять же, со слов Расмуса, «статический анализатор должен сделать в 10 раз больше вещей, чем обычный парсер РНР». Задача анализатора — отследить все возможные косяки до компиляции.
С другой стороны, ничто не мешает ту же самую функциональность реализовать силами IDE — ведь, теоретически, ide может отследить потерянный инклюд, лишние аргументы функции и многое другое. Вопрос — насколько полно и точно они это делают.
UFO just landed and posted this here
Тоже понравилась эта часть доклада Расмуса!
Спасибо за более развернутую информацию…
image

А теперь этот же момент для ностальгии по Devconf ;)
Пардон, из статьи не совсем понятно, в каком виде он выводит результаты. Файлы называются *.js и вы называете этот формат «json», однако в примере явно вывод, аналогичный var_dump().
Прошу прощения, я не совсем точно написал «расшифровывается». Расшифровывется JSON в указанный в статье var_dump. Просто содержимое однострочного JSON публиковать в статье некрасиво.
> Он транслирует PHP в C++!

Значит, для C++ есть какой-то открытый/бесплатный статический анализатор. Какой именно тут используется?

Пару лет назад озаботился поиском такового, пригодного к использованию не нашел.
Тот, о котором идет речь здесь, анализирует PHP. До трасляции в С++.
Интересный подход! А есть ли пример С++ кода который получается после выполенения хипхопа на каком-нибудь php файле? Очень любопытно глянуть что там получается…

У перла есть тоже что-то подобное в стандартной поставке, но оно дико глючит, для средних проектов генерит С файлы размером метров по 10, от которых gcc встает раком на полчаса и более.
Огромное спасибо за статью.
Анализатор запускается, создает файлы со статистикой и ошибками.

Тем не менее я столкнулся с проблемой того, что файл CodeError.js всегда содержит 0 ошибок, какой бы код я не анализировал (даже с нарочно внесенными ошибками).

Выглядит он всегда вот так:
CodeError.js:
[0,{}
]


Сталкивались ли вы с такой проблемой?
Возможно в статье вы не упомянули о каких-то дополнительных настройках, управляющих записью ошибок в файл CodeError.js?
А что содержит Stats.js?

Может у вас не сканируется ни один файл?

Например если задана переменная окружения $SRC_DIR или пуст файл со списком для проверки
Файлы сканируются — это видно при включении лога.
Содержимое Stats.us выложил здесь, вместе с примером анализа: habrahabr.ru/qa/23410/
Sign up to leave a comment.

Articles