Psalma 3.12 izlaišana, statiskais PHP valodas analizators. PHP 8.0 alfa izlaidums

Uzņēmums Vimeo опубликовала jauns statiskā analizatora izlaidums psalms 3.12, kas ļauj identificēt gan acīmredzamas, gan smalkas kļūdas PHP kodā, kā arī automātiski labot dažu veidu kļūdas. Sistēma ir piemērota problēmu identificēšanai gan mantotajā kodā, gan kodā, kas izmanto mūsdienīgas funkcijas, kas ieviestas jaunajās PHP atzaros. Projekta kods ir uzrakstīts PHP un izplata saskaņā ar MIT licenci.

Psalms identificē lielāko daļu problēmu, kas saistītas ar nepareizu veidu lietošanu, kā arī dažādas tipiskas kļūdas. Piemēram, tas atbalsta brīdinājumus par dažādu veidu mainīgo sajaukšanu izteiksmē, nepareizas loģiskās pārbaudes (piemēram, “if ($a && $a) {}”, “if ($a && !$a) {}” un “ if ( $a) {} elseif ($a) {}"), nepilnīga objekta īpašību inicializācija. Analizators darbojas vairāku vītņu režīmā. Ir iespējams veikt pakāpenisku skenēšanu, kas analizē tikai failus, kas ir mainījušies kopš pēdējās skenēšanas.

Turklāt tiek nodrošināti droši programmēšanas rīki izmantot anotācijas formātā Docblock (“/** @var Type */”), lai sniegtu informāciju par mainīgo veidiem, atgriešanas vērtībām, funkciju parametriem, objekta īpašībām. Tiek atbalstīta arī tipu lietošanas modeļu noteikšana un apgalvojumu izmantošana. Piemēram:

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

/** @var virkne $a */
echo strpos($a, 'sveicināti');

/** @psalm-assert-if-true B $a */
funkcija irValidB(A $a) : bool {
atgriezt $a instanceof B && $a->isValid();
}

Lai automatizētu atrasto problēmu novēršanu, tiek nodrošināta utilīta Psalter, kas atbalsta spraudņus un pieļauj novērst izplatītas koda problēmas, pievienot tipa anotācijas un veikt tādas manipulācijas kā klases pārvietošana no vienas nosaukumvietas uz citu, metožu pārvietošana starp klasēm un klašu un metožu pārdēvēšana.

Jaunajā Psalma numurā īstenota opcija "--taint-analysis" ļauj izsekot saistību starp ievades parametriem, kas saņemti no lietotāja (piemēram, $_GET['name']) un to izmantošanu vietās, kur nepieciešama rakstzīmju atkāpšanās (piemēram, echo " $name "), tostarp izmantojot starpposma uzdevumu un funkciju izsaukumu izsekošanas ķēdes. Asociatīvo masīvu $_GET, $_POST un $_COOKIE izmantošana tiek uzskatīta par potenciāli bīstamu datu avotiem, taču tas ir arī iespējams noteikt pašu avoti. Darbības, kurām nepieciešama izsekošana, ietver izvades darbības, kas ģenerē HTML saturu, pievieno HTTP galvenes vai izpilda SQL vaicājumus.

Validācija tiek izmantota, izmantojot tādas funkcijas kā echo, exec, include un header. Analizējot aizbēgšanas nepieciešamību, tiek ņemti vērā tādi datu tipi kā teksts, virknes ar SQL, HTML un Shell kodu, virknes ar autentifikācijas parametriem. Piedāvātais režīms ļauj identificēt koda ievainojamības, kas noved pie starpvietņu skriptēšanas (XSS) vai SQL aizstāšanas.

Turklāt var atzīmēt sākums jaunā PHP 8.0 filiāles alfa testēšana. Izlaidums ir paredzēts 26. novembrī. Jaunajā filiālē sagaidāms: jauninājumiemTā kā:

  • Iespējot JIT kompilators, kuru izmantošana uzlabos produktivitāti.
  • atbalsts arodbiedrību veidi, definējot divu vai vairāku veidu kolekcijas (piemēram, “publiskā funkcija foo(Foo|Bar $input): int|float;”).
  • atbalsts atribūti (anotācijas), kas ļauj saistīt metadatus (piemēram, tipa informāciju) klasēm, neizmantojot Docblock sintaksi.
  • Saīsināta sintakse klašu definīcijas, ļaujot apvienot konstruktora definīciju un īpašības.
  • Jauns atgriešanas veids - statisks.
  • Jauns tips - sajaukts, ko var izmantot, lai noteiktu, vai funkcija pieņem dažāda veida parametrus.
  • Izteiksme mest rīkoties ar izņēmumiem.
  • Vāja karte lai izveidotu objektus, kurus var upurēt atkritumu savākšanas laikā (piemēram, lai uzglabātu nevajadzīgas kešatmiņas).
  • Iespēja izmantojot izteiksmi “::class” objektiem (analogs get_class() izsaukšanai).
  • Iespēja definīcijas izņēmumu nozvejas blokā, kas nav saistīti ar mainīgajiem.
  • Iespēja aiz pēdējā elementa funkcijas parametru sarakstā atstājot komatu.
  • Jauns interfeiss Stingrs lai identificētu visus virkņu veidus vai datus, ko var pārvērst virknē (kurai ir pieejama metode __toString()).
  • Jauna funkcija str_contains(), vienkāršots strpos analogs apakšvirknes rašanās noteikšanai, kā arī funkcijas str_starts_with() un str_ends_with(), lai pārbaudītu atbilstību virknes sākumā un beigās.
  • Pievienota funkcija fdiv(), kas veic dalīšanas darbību, neizmetot kļūdu dalot ar nulli.
  • Mainīts virkņu savienošanas loģika. Piemēram, izteiciens 'echo "sum:" . $a + $b' iepriekš tika interpretēts kā 'echo ("sum: " . $a) + $b', un PHP 8 tiks uzskatīts par "echo "sum: " . ($a + $b)”.
  • Savilkts pārbaudot aritmētiskās un bitu darbības, piemēram, izteicieni "[] % [42]" un "$object + 4" radīs kļūdu.
  • Īstenots stabils šķirošanas algoritms, kurā identisku vērtību secība tiek saglabāta dažādos palaijumos.

Avots: opennet.ru

Pievieno komentāru