Выпуск 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" будуць прыводзіць да памылкі.
Рэалізаваны стабільны алгарытм сартавання, у якім пры розных запусках захоўваецца парадак прытрымлівання аднолькавых значэнняў.