Vimeo ettevõte uue staatilise analüsaatori väljaanne , mis tuvastab nii ilmsed kui ka raskesti märgatavad vead PHP keeles kirjutatud koodis ning parandab automaatselt teatud tüüpi vigu. Süsteem sobib probleemide avastamiseks nii vananenud koodis kui ka koodis, mis kasutab uusi võimalusi, mis on tekkinud PHP uutes harudes. Projekti kood on kirjutatud PHP keeles ja on MIT litsentsi all.
Psalm tuvastab enamik probleeme, mis on seotud tüüpide vale kasutamisega, samuti erinevad . Näiteks toetatakse hoiatuste väljastamist segamise kohta muutujate vahel erinevates tüüpides, vale loogiliste kontrollide puhul (nt „if ($a && $a) {}“, „if ($a && !$a) {}“ ja „if ($a) {} elseif ($a) {}“), objekti omaduste mittetäielik algatamine. Analüsaator töötab lõimede režiimis. On võimalik teostada inkrementaalseid kontrollimisi, kus analüüsitakse ainult faile, mis on muutunud alates viimase kontrollimise ajast.
Lisaks on saadaval ohutu programmeerimise vahendid, mis võimaldavad annotatsioone vormingus («/** @var Type */») muutujatüüpide, tagastatavate väärtuste, funktsiooniparametrite ja objekti omaduste teabe edastamiseks. Samuti toetatakse tüüpide kasutusmallide määratlemist ja assert-käskluste rakendamist. Näiteks:
/** @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();
}
Leitud probleemide automaatseks lahendamiseks on olemas utiliit Psalter, mis toetab pluginaid ja lahendab koodis tüüpilisi probleeme, lisab tüüpide annotatsioone ning teostab selliseid toiminguid nagu klasside liigutamine ühest nimestikku teise, meetodite liigutamine klasside vahel, klasside ja meetodite nimede muutmine.
Uues Pilaris valik «—taint-analysis», mis võimaldab jälgida seoseid kasutajalt saadud sisendparameetrite (näiteks $_GET[‘name’]) ja nende kasutamise vahel kohtades, kus on vajalik sümbolite escaping (nt echo «<h1>$name</h1>»), sealhulgas jälgides vahepealseid määramisi ja funktsioonikutsungite ahelat. Potentsiaalselt ohtlike andmete allikateks peetakse assotsiatiivsete massiivide kasutamist $_GET, $_POST ja $_COOKIE, kuid mõeldav on ka oma allikatest. Ekstraheerimise jälgimist vajavad toimingud hõlmavad väljundite operatsioone, mis viivad HTML-formaadis sisu genereerimise, HTTP-pealkirjade lisamise või SQL-päringute täitmiseni.
Kontroll rakendub selliste funktsioonide kasutamisel nagu echo, exec, include ja header. Andmete eristamisel, mis vajavad escape'i, arvestatakse andmetüüpe, nagu tekst, SQL stringid, HTML ja shell-kood, autentimisparameetrite stringid. Pakutud režiim võimaldab tuvastada koodis haavatavusi, mis võivad viia XSS (Cross-Site Scripting) või SQL-i sisestamise rünnakuteni.
Lisaks saab märkida PHP 8.0 uue haru alfa-testimine. Väljalase on planeeritud 26. novembriks. Uues haru oodatakse selliseid , nagu:
- , mille rakendamine võimaldab suurendada jõudlust.
- Toetamine , mis määratlevad kollektsioonid, mis koosnevad kahest või enamast tüübist (nt „public function foo(Foo|Bar $input): int|float;“).
- Toetamine (annotatsioonide), mis võimaldavad siduda metaandmeid (nt teavet tüüpide kohta) klassidega ilma Docblock süntaksit kasutamata.
- klasside määratlemiseks, mis võimaldab kombineerida konstruktori ja omaduste määratlemise.
- Uus tagastatavate väärtuste tüüp — .
- Uus tüüp — , mida saab kasutada funktsioonile erinevate tüüpide parameetrite määratlemiseks.
- Väljend erandite töötlemiseks.
- objektide loomiseks, millest on võimalik loobuda prügi kogumise ajal (näiteks valikuliste vahetaminekube hoidmiseks).
- väljendi „::class“ kasutamine objektide jaoks (sarnane get_class() väljakutsetega).
- erandite määratlemine catch plokis, mida ei seostata muutujatega.
- viimane element funktsiooni parameetrite nimekirjas koma sümboli jätmine.
- Uus liides kõikide stringi tüüpide või andmete identifitseerimiseks, mida saab muuta stringiks (kellel on meetod __toString()).
- Uus funktsioon , lihtsustatud analoog strpos-st, et määrata alammängu esinemist ning funktsioonid str_starts_with() ja str_ends_with(), et kontrollida vastavust stringi alguses ja lõpus.
- Lisa funktsionaalsus , teostab jagamistehte, ilma et tekiks viga jagamisel nulliga.
- stringide ühendamise loogika. Näiteks väljend ‘echo «sum: » . $a + $b’ tõlgendati varem kui ‘echo («sum: » . $a) + $b’, kuid PHP 8-s töödeldakse seda kui ‘echo «sum: » . ($a + $b)’.
- aritmeetiliste ja bititegevuste kontroll, näiteks väljendid «[] % [42]» ja «$object + 4» põhjustavad vea.
- stabiilne sortimise algoritm, kus erinevate käivituste ajal säilitatakse sama väärtuse järjestus.
Allikas: opennet.ru
