Випуск 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 листопада. У новій гілці очікуються такі нововведення, Як:

  • включення JIT-компілятора, Застосування якого дозволить підвищити продуктивність.
  • Підтримка union-типів, визначальних колекції двох і більше типів (наприклад «public function foo(Foo|Bar $input): int|float;»).
  • Підтримка атрибутів (анотацій), що дозволяють прив'язати метадані (наприклад, відомості про типи) до класів без використання синтаксису Docblock.
  • Скорочений синтаксис визначення класів, що дозволяє об'єднати визначення конструктора та властивостей.
  • Новий тип значень, що повертаються. статичний.
  • Новий тип змішаний, який може застосовуватися визначення прийому функцією параметрів з різними типами.
  • вираз кидати для обробки винятків.
  • 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» призводитимуть до помилки.
  • Реалізовано стабільний алгоритм сортування, у якому за різних запусках зберігається порядок слідування однакових значень.

Джерело: opennet.ru

Додати коментар або відгук