Випуск Psalm 3.12, статичного аналізатора для PHP мови. Альфа випуск PHP 8.0
Компанія Vimeo опублікувала новий випуск статичного аналізатора Псалом 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 « $name »), у тому числі через відстеження ланцюжків проміжних привласнень та викликів функцій. Як джерела потенційно небезпечних даних розглядається використання асоціативних масивів $_GET, $_POST і $_COOKIE, але можливо і визначення власних джерел. З дій, що вимагають відстеження екранування, розглядаються операції виведення, що призводять до формування контенту у форматі HTML, додавання заголовків HTTP або виконання SQL-запитів.
Перевірка застосовується при використанні таких функцій, як echo, exec, include та header. При аналізі необхідності екранування враховуються типи даних, як-от текст, рядки з SQL, HTML і Shell-кодом, рядки з параметрами аутентифікації. Запропонований режим дозволяє виявляти вразливості в коді, що призводять до міжсайтового скриптингу (XSS) або до встановлення SQL-коду.
Додатково можна відзначити розпочало альфа-тестування нової гілки PHP 8.0. Реліз заплановано на 26 листопада. У новій гілці очікуються такі нововведення, Як:
WeakMap для створення об'єктів, якими можна пожертвувати під час складання сміття (наприклад, для зберігання необов'язкових кешів).
Можливість використання виразу «::class» для об'єктів (аналог виклику get_class()).
Можливість визначення у блоці catch винятків, не прив'язаних до змінних.
Можливість залишити символ комою після останнього елемента у списку параметрів функції.
Новий інтерфейс Струнний для ідентифікації будь-яких рядкових типів або даних, яких можна перетворити на рядок (для яких доступний метод __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» призводитимуть до помилки.
Реалізовано стабільний алгоритм сортування, у якому за різних запусках зберігається порядок слідування однакових значень.