Выпуск 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

Дадаць каментар