Compania Vimeo noua versiune a analizatorului static , care permite identificarea atât a erorilor evidente, cât și a celor greu de detectat în codul PHP, precum și corectarea automată a unor tipuri de erori. Sistemul este potrivit pentru identificarea problemelor atât în codul mai vechi, cât și în cel care utilizează caracteristici moderne introduse în noile ramuri PHP. Codul proiectului este scris în PHP și sub licența MIT.
Psalm identifică cea mai mare parte a problemelor legate de utilizarea necorespunzătoare a tipurilor, precum și diverse . De exemplu, suportă emiterea de avertizări cu privire la amestecarea variabilelor de tipuri diferite în expresii, verificări logice necorespunzătoare (cum ar fi „if ($a && $a) {}”, „if ($a && !$a) {}” și „if ($a) {} elseif ($a) {}”), inițializări incomplete ale proprietăților obiectelor. Analizatorul rulează în modul multi-threading. Este posibilă efectuarea de verificări incrementale, în care sunt analizate doar fișierele modificate de la ultima verificare.
În plus, sunt furnizate instrumente pentru programarea sigură, care permit anotații în format („/** @var Type */”) pentru a furniza informații despre tipurile variabilelor, valorile returnate, parametrii funcțiilor, proprietățile obiectelor. De asemenea, este acceptată definirea șabloanelor de utilizare a tipurilor și aplicarea expresiilor de asertare. De exemplu:
/** @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();
}
Pentru automatizarea soluționării problemelor identificate, este disponibil utilitarul Psalter, care suportă plugin-uri și soluționează probleme tipice în cod, adaugă anotații despre tipuri, precum și efectuează astfel de manipulări ca mutarea claselor dintr-un spațiu de nume în altul, mutarea metodelor între clase, redenumirea claselor și metodelor.
În noua versiune a Psalm opțiunea „—taint-analysis”, care permite urmărirea legăturii dintre parametrii de intrare primiți de la utilizator (de exemplu, $_GET[‘name’]) și utilizarea lor în locuri care necesită escaparea caracterelor (de exemplu, echo „<h1>$name</h1>”), inclusiv prin monitorizarea lanțurilor de atribuiri intermediare și apeluri de funcții. Ca surse de date potențial periculoase se consideră utilizarea array-urilor asociative $_GET, $_POST și $_COOKIE, dar este posibil și surselor proprii. Acțiunile care necesită urmărirea escapării includ operațiuni de ieșire care conduc la generarea de conținut în format HTML, adăugarea de antete HTTP sau executarea de interogări SQL.
Verificarea se aplică atunci când se utilizează funcții precum echo, exec, include și header. La analiza necesității de escapare, se iau în considerare tipuri de date precum text, șiruri SQL, HTML și cod shell, precum și șiruri cu parametrii de autentificare. Modului propus îi permite să identifice vulnerabilitățile din cod care pot conduce la atacuri de tip cross-site scripting (XSS) sau la inserții de cod SQL.
apariția alpha-testing pentru noua ramură PHP 8.0. Lansarea este planificată pentru 26 noiembrie. În noua ramură se așteaptă , cum ar fi:
- , al cărui utilizare va permite creșterea performanței.
- Asistență , care definesc colecții din două sau mai multe tipuri (de exemplu „public function foo(Foo|Bar $input): int|float;”).
- Asistență (anotații), care permit asocierea de metadate (de exemplu, informații despre tipuri) cu clasele fără a utiliza sintaxa Docblock.
- pentru definirea claselor, care permite combinarea definiției constructorului și a proprietăților.
- Un nou tip de valori returnate — .
- Un nou tip — , care poate fi utilizat pentru a defini parametrii funcției care au tipuri diferite.
- Expresia pentru gestionarea excepțiilor.
- pentru crearea de obiecte care pot fi distruse prin colectarea deșeurilor (de exemplu, pentru stocarea de cache-uri opționale).
- utilizarea expresiei „::class” pentru obiecte (analog cu apelul get_class()).
- definirea în blocul catch a excepțiilor neasociate cu variabile.
- lăsarea unui simbol de virgulă după ultimul element din lista de parametri ai funcției.
- Nouă interfață pentru identificarea oricăror tipuri de date sau șiruri care pot fi transformate într-un șir (pentru care este disponibilă metoda __toString()).
- Nouă funcție , un echivalent simplificat al strpos pentru determinarea prezenței unei subștii, precum și funcțiile str_starts_with() și str_ends_with() pentru a verifica corespondențele la începutul și sfârșitul șirului.
- Funcție adăugată , care execută operația de împărțire fără a genera o eroare în cazul împărțirii la zero.
- modificată. De exemplu, expresia ‘echo „sum: ” . $a + $b’ a fost interpretată anterior ca ‘echo („sum: ” . $a) + $b’, iar în PHP 8 va fi procesată ca ‘echo „sum: ” . ($a + $b)’.
- verificarea operațiunilor aritmetice și bitwise, de exemplu, expresiile „[] % [42]” și „$object + 4” vor genera o eroare.
- un algoritm stabil de sortare, în care ordinea valorilor identice este păstrată în diferite execuții.
Sursa: opennet.ro
