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

2 июля 2020 года

Компания Vimeo опубликовала новый выпуск статического анализатора Psalm 3.12(недоступная ссылка), позволяющего выявлять как очевидные, так и трудноуловимые ошибки в коде на языке PHP, а также автоматически исправлять некоторые виды ошибок. Система подходит для выявления проблем как в устаревшем коде, так и в коде, использующем современные возможности, появившиеся в новых ветках PHP. Код проекта написан на языке PHP и распространяется под лицензией MIT.

Psalm определяет большую часть проблем, связанных с некорректным использованием типов, а также разнообразные типичные ошибки. Например, поддерживается вывод предупреждений о смешивании в выражении переменных с разными типами, некорректных логических проверках (таких как "if ($a && $a) {}", "if ($a && !$a) {}" и "if ($a) {} elseif ($a) {}"), неполной инициализации свойств объекта. Анализатор выполняется в многопоточном режиме. Возможно выполнение инкрементальных проверок, при которых анализируются только файлы, изменившиеся с момента прошлой проверки.

Дополнительно предоставляются средства безопасного программирования, позволяющие использовать аннотации в формате Docblock ("/** @var Type */") для предоставления информации о типах переменных, возвращаемых значениях, параметрах функций, свойствах объектов. Также поддерживается определение шаблонов использования типов и применение выражений 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 ноября. В новой ветке ожидаются такие новшества, как:

  • Включение JIT-компилятора, применение которого позволит повысить производительность.
  • Поддержка 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)'.
  • Ужесточена проверка арифметических и битовых операций, например, выражения "[] % [42]" и "$object + 4" будут приводить к ошибке.
  • Реализован стабильный алгоритм сортировки, в котором при разных запусках сохраняется порядок следования одинаковых значений.

Источники

править
 
 
Creative Commons
Эта статья содержит материалы из статьи «Выпуск Psalm 3.12, статического анализатора для языка PHP. Альфа выпуск PHP 8.0», опубликованной OpenNET и распространяющейся на условиях лицензии Creative Commons Attribution (CC BY) — указание автора, источник и лицензию.
 
Эта статья загружена автоматически ботом NewsBots и ещё не проверялась редакторами Викиновостей.
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.

Комментарии

Викиновости и Wikimedia Foundation не несут ответственности за любые материалы и точки зрения, находящиеся на странице и в разделе комментариев.