Publicació de Psalm 3.12, un analitzador estàtic per al llenguatge PHP. Versió alfa de PHP 8.0

Empresa Vimeo publicat nova versió de l'analitzador estàtic salm 3.12, que permet identificar errors evidents i subtils en el codi PHP, així com corregir automàticament alguns tipus d'errors. El sistema és adequat per identificar problemes tant en codi heretat com en codi que utilitza funcions modernes introduïdes a les noves branques de PHP. El codi del projecte està escrit en PHP i Distribuït per sota la llicència MIT.

El salm identifica la majoria dels problemes associats amb l'ús incorrecte del tipus, així com diversos errors típics. Per exemple, admet advertències sobre la barreja de variables de diferents tipus en una expressió, proves lògiques incorrectes (com ara "si ($a && $a) {}", "si ($a && !$a) {}" i " if ( $a) {} elseif ($a) {}"), inicialització incompleta de les propietats de l'objecte. L'analitzador funciona en mode multifils. És possible realitzar exploracions incrementals, que només analitzen els fitxers que han canviat des de l'última exploració.

A més, es proporcionen eines de programació segura per permetre ús anotacions en el format Docblock (“/** @var Tip */”) per proporcionar informació sobre tipus de variables, valors de retorn, paràmetres de funció i propietats d'objecte. També s'admet la definició de patrons d'ús de tipus i l'ús de declaracions assert. Per exemple:

/** @var string|null */
$a = foo();

/** @var cadena $a */
echo strpos($a, 'hola');

/** @psalm-assert-if-true B $a */
la funció ésValidaB(A $a): bool {
retorna $a instància de B && $a->isValid();
}

Per automatitzar l'eliminació dels problemes trobats, es proporciona la utilitat Psalter, que admet connectors i permet resoldre problemes de codi habituals, afegir anotacions de tipus i realitzar manipulacions com ara moure classes d'un espai de noms a un altre, moure mètodes entre classes i canviar el nom de classes i mètodes.

En el nou número de Salm implementat l'opció "--taint-analysis" us permet rastrejar la relació entre els paràmetres d'entrada rebuts de l'usuari (per exemple, $_GET['name']) i el seu ús en llocs que requereixen escapar de caràcters (per exemple, echo " $nom "), fins i tot mitjançant cadenes de seguiment d'assignacions intermèdies i trucades de funcions. L'ús de matrius associatives $_GET, $_POST i $_COOKIE es considera fonts de dades potencialment perilloses, però també és possible determinació de fonts pròpies. Les accions que requereixen el seguiment d'escapament inclouen operacions de sortida que generen contingut HTML, afegeixen capçaleres HTTP o executen consultes SQL.

La validació s'utilitza quan s'utilitzen funcions com echo, exec, include i header. A l'hora d'analitzar la necessitat d'escapament, es tenen en compte els tipus de dades com el text, les cadenes amb codi SQL, HTML i Shell, les cadenes amb paràmetres d'autenticació. El mode proposat us permet identificar vulnerabilitats en el codi que condueixen a scripts entre llocs (XSS) o substitució d'SQL.

A més, es pot assenyalar iniciar prova alfa de la nova branca PHP 8.0. El llançament està previst per al 26 de novembre. A la nova delegació s'espera el següent: innovacionsCom:

  • Inclusió Compilador JIT, l'ús del qual millorarà la productivitat.
  • suport tipus de sindicats, definint col·leccions de dos o més tipus (per exemple, “funció pública foo(Foo|Bar $input): int|float;”).
  • suport atributs (anotacions) que us permeten enllaçar metadades (com ara informació de tipus) a classes sense utilitzar la sintaxi de Docblock.
  • Sintaxi escurçada definicions de classe, que us permeten combinar la definició d'un constructor i propietats.
  • Nou tipus de retorn - estàtic.
  • Nou tipus - mixt, que es pot utilitzar per determinar si una funció accepta paràmetres de diferents tipus.
  • Expressió llançar per gestionar les excepcions.
  • WeakMap per crear objectes que es poden sacrificar durant la recollida d'escombraries (per exemple, per emmagatzemar memòria cau innecessària).
  • Oportunitat utilitzant l'expressió "::class" per als objectes (anàloga a cridar get_class()).
  • Oportunitat definicions al bloc catch d'excepcions que no estan lligades a variables.
  • Oportunitat deixant una coma després de l'últim element de la llista de paràmetres de funció.
  • Nova interfície Cordable per identificar qualsevol tipus de cadena o dada que es pugui convertir en una cadena (per a la qual està disponible el mètode __toString()).
  • Nova característica str_contain(), un anàleg simplificat de strpos per determinar l'aparició d'una subcadena, així com les funcions str_starts_with() i str_ends_with() per comprovar les coincidències al principi i al final d'una cadena.
  • Característica afegida fdiv(), que realitza una operació de divisió sense llançar un error en dividir per zero.
  • Canviat lògica d'unió de cadenes. Per exemple, l'expressió 'echo "sum:" . $a + $b' s'havia interpretat anteriorment com a 'eco ("suma: " . $a) + $b', i a PHP 8 es tractarà com a "eco "sum: ". ($a + $b)'.
  • Estrènyer comprovant operacions aritmètiques i de bits, per exemple, les expressions "[] % [42]" i "$object + 4" donaran lloc a un error.
  • Implementat un algorisme d'ordenació estable en el qual es conserva l'ordre de valors idèntics en diferents execucions.

Font: opennet.ru

Afegeix comentari