Выпуск Psalm 3.12, статического анализатора для языка PHP. Альфа выпуск PHP 8.0

Кoмпaния Vimeo oпубликoвaлa нoвый ливрезон стaтичeскoгo aнaлизaтoрa Psalm 3.12, пoзвoляющeгo обнаруживать кaк oчeвидныe, тaк и труднoулoвимыe oшибки в кoдe нa языкe PHP, a тaкжe aвтoмaтичeски испрaвлять нeкoтoрыe намерение oшибoк. Систeмa пoдxoдит для выявлeния прoблeм кaк в устaрeвшeм кoдe, тaк и в коде, использующем современные внутренние резервы, появившиеся в новых ветках PHP. Код проекта написан возьми языке PHP и распространяется под лицензией MIT. Psalm определяет большую глава проблем, связанных с некорректным использованием типов, а да разнообразные типичные ошибки. Например, поддерживается обобщение предупреждений о смешивании в выражении переменных с разными типами, некорректных логических проверках (таких на правах "if ($a && $a) {}", "if ($a && !$a) {}" и "if ($a) {} elseif ($a) {}"), неполной инициализации свойств объекта. Анализатор выполняется в многопоточном режиме. Вот и все поддерживается определение шаблонов использования типов и использование выражений assert. Например: /** @var string|null */ $a = foo(); /** @var string $a */ echo strpos($a, 'hello'); /** @psalm-assert-if-true B $a */ function isValidB(A $a) : bool { return $a instanceof B && $a->isValid(); } Интересах автоматизации устранения найденных проблем предоставляется обслуживающая программа Psalter, которая поддерживает плагины и позволяет уничтожать типовые проблемы в коде, добавлять аннотации о типах, а в свою очередь выполнять такие манипуляции, как передвижение классов из одного пространства имён в другое, переваливание методов между классами, переименовывание классов и методов. В новом выпуске Psalm реализована опция "--taint-analysis", позволяющая отследить связь между полученными от пользователя входными параметрами (так, $_GET['name']) и их использованием в местах, требующих экранирования символов ((пред)положим, echo "‹h1›$name‹/h1›"), в томик числе через отслеживание цепочек промежуточных присвоений и вызовов функций. В качестве источников потенциально опасных данных рассматривается эксплуатация ассоциативных массивов $_GET, $_POST и $_COOKIE, так возможно и определение собственных источников. С действий, требующих отслеживания экранирования, рассматриваются операции вывода, приводящие к формированию контента в формате HTML, добавлению HTTP-заголовков разве выполнению SQL-запросов. Проверка применяется рядом использовании таких функций, как echo, exec, include и header. Быть анализе необходимости экранирования учитываются типы данных, такие ровно текст, строки с SQL, HTML и Shell-кодом, строки с параметрами аутентификации. Ставленный режим позволяет выявлять уязвимости в коде, приводящие к межсайтовому скриптингу (XSS) другими словами подстановке SQL-кода. Дополнительно можно наметить начало альфа-тестирования новой ветки PHP 8.0. Релиз намечен бери 26 ноября. Поддержка union-типов, определяющих коллекции изо двух и более типов (например "public function foo(Foo|Bar $input): int|float;"). Подспорье атрибутов (аннотаций), позволяющих привязать метаданные (за примером далеко ходить не нужно, сведения о типах) к классам без использования синтаксиса Docblock. Суженный синтаксис определения классов, позволяющий размежевать определение конструктора и свойств. Новый категория возвращаемых значений - static. Новый образ - mixed, который может применяться про определения приёма функцией параметров с разными типами. Речение throw для обработки исключений. WeakMap пользу кого создания объектов, которыми можно поступиться при сборке мусора (например, для того хранения необязательных кэшей). Возможность использования выражения "::class" в (видах объектов (аналог вызова get_class()). Виртуальность определения в блоке catch исключений, невыгодный привязанных к переменным. Возможность оставления символа запятой позже последнего элемента в списке параметров функции. Новейший интерфейс Stringable для идентификации любых строковых типов аль данных, которых можно преобразовать в строку (интересах которых доступен метод__toString()). Новая деятельность str_contains(), упрощённый аналог strpos к определения вхождения подстроки, а также функции str_starts_with() и str_ends_with() исполнение) проверки совпадений в начале и конце строки. Добавлена работа fdiv(), выполняющая операцию деления минус вывода ошибки в случае деления возьми ноль. Изменена логика соединения строк. Во, выражение 'echo "sum: ". $a + $b' перед интерпретировалось как 'echo ("sum: ". $a) + $b', а в PHP 8 пора и совесть знать обработано как 'echo "sum: ". ($a + $b)'. Реализован нефиксированный алгоритм сортировки, в котором при разных запусках сохраняется регламент следования одинаковых значений. Источник: http://www.opennet.ru/opennews/art.shtml?num=53257