Liberasyon Sòm 3.12, yon analizè estatik pou lang PHP. Alpha lage PHP 8.0

Konpayi Vimeo pibliye nouvo lage nan analizè estatik Sòm 3.12, ki pèmèt ou idantifye tou de erè evidan ak sibtil nan kòd PHP, osi byen ke otomatikman korije kèk kalite erè. Sistèm nan apwopriye pou idantifye pwoblèm tou de nan kòd eritaj ak nan kòd ki sèvi ak karakteristik modèn prezante nan nouvo branch PHP. Kòd pwojè a ekri nan PHP ak distribiye pa anba lisans MIT.

Sòm idantifye pi fò nan pwoblèm ki asosye ak itilizasyon kalite kòrèk, osi byen ke divès kalite erè tipik. Pa egzanp, li sipòte avètisman sou melanje varyab diferan kalite nan yon ekspresyon, tès lojik ki pa kòrèk (tankou "si ($a && $a) {}", "si ($a && !$a) {}" ak " if ($a) {} elseif ($a) {}"), inisyalizasyon enkonplè pwopriyete objè yo. Analizè a kouri nan mòd milti-threaded. Li posib pou fè analiz incrémentielle, ki analize sèlman dosye ki te chanje depi dènye eskanè a.

Anplis de sa, yo bay zouti pwogramasyon an sekirite pou pèmèt itilize annotations nan fòma a Docblock ("/** @var Kalite */") pou bay enfòmasyon sou kalite varyab, valè retounen, paramèt fonksyon, pwopriyete objè. Yo sipòte tou defini modèl itilizasyon kalite epi sèvi ak deklarasyon afimasyon. Pa egzanp:

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

/** @var string $a */
eko strpos($a, 'alo');

/** @psalm-assert-if-true B $a */
fonksyon isValidB(A $a): bool {
retounen $a egzanp B && $a->isValid();
}

Pou otomatize eliminasyon yo jwenn pwoblèm, yo bay sèvis piblik Psalter, ki sipòte grefon ak pèmèt rezoud pwoblèm kòd komen yo, ajoute tip anotasyon, epi fè manipilasyon tankou deplase klas soti nan yon espas non nan yon lòt, deplase metòd ant klas yo, ak chanje non klas ak metòd.

Nan nouvo nimewo Sòm la aplike "--taint-analysis" opsyon a pèmèt ou trase relasyon ki genyen ant paramèt opinyon yo resevwa nan men itilizatè a (pa egzanp, $_GET['name']) ak itilizasyon yo nan kote ki mande karaktè chape (pa egzanp, eko " $non "), ki gen ladan atravè chèn swiv nan devwa entèmedyè ak apèl fonksyon. Itilizasyon etalaj asosyasyon $_GET, $_POST ak $_COOKIE konsidere kòm sous done potansyèlman danjere, men li posib tou. definisyon sous pwòp. Aksyon ki mande pou chape anba swiv yo enkli operasyon pwodiksyon ki jenere kontni HTML, ajoute tèt HTTP, oswa egzekite demann SQL.

Validasyon yo itilize lè w ap itilize fonksyon tankou eko, exec, enkli ak header. Lè w ap analize bezwen pou chape, kalite done tankou tèks, fisèl ak SQL, HTML ak kòd Shell, fisèl ak paramèt otantifikasyon yo pran an kont. Mòd yo pwopoze a pèmèt ou idantifye vilnerabilite nan kòd ki mennen nan scripting cross-site (XSS) oswa sibstitisyon SQL.

Anplis de sa, li ka remake kòmanse tès alfa nan nouvo branch PHP 8.0 la. Liberasyon an pwograme pou 26 novanm. Sa ki annapre yo espere nan nouvo branch lan: inovasyontankou:

  • Pouvwa moute JIT du, itilizasyon ki pral amelyore pwodiktivite.
  • Sipòte kalite sendika yo, defini koleksyon de oswa plis kalite (pa egzanp, "fonksyon piblik foo(Foo|Bar $input): int|float;").
  • Sipòte atribi yo (anotasyon) ki pèmèt ou mare metadata (tankou enfòmasyon tip) nan klas yo san yo pa itilize sentaks Docblock.
  • Sentaks ki pi kout definisyon klas, ki pèmèt ou konbine definisyon yon konstrukteur ak pwopriyete.
  • Nouvo kalite retounen - estatik.
  • Nouvo kalite - melanje, ki ka itilize pou detèmine si yon fonksyon aksepte paramèt diferan kalite.
  • Ekspresyon voye jete pou okipe eksepsyon yo.
  • WeakMap pou kreye objè ki ka sakrifye pandan koleksyon fatra (pa egzanp, pou estoke kachèt ki pa nesesè).
  • Posibilite lè l sèvi avèk ekspresyon "::class" pou objè (analòg ak rele get_class()).
  • Posibilite definisyon nan blòk la trape nan eksepsyon ki pa mare ak varyab.
  • Posibilite kite yon vigil apre dènye eleman nan lis paramèt fonksyon yo.
  • Nouvo koòdone Stringable pou idantifye nenpòt kalite fisèl oswa done ki ka konvèti nan yon fisèl (pou ki metòd la __toString() disponib).
  • Nouvo karakteristik str_contains(), yon analòg senplifye nan strpos pou detèmine ensidan an nan yon substring, osi byen ke fonksyon yo str_starts_with() ak str_ends_with() pou tcheke alimèt nan kòmansman ak nan fen yon fisèl.
  • Te ajoute fonksyon fdiv(), ki fè yon operasyon divizyon san yo pa voye yon erè lè divize pa zewo.
  • Chanje fisèl rantre lojik. Pou egzanp, ekspresyon 'echo "som:" . $a + $b' te deja entèprete kòm 'eko ("som: ". $a) + $b', epi nan PHP 8 yo pral trete kòm 'eko "som: ". ($a + $b)'.
  • Sere boulon tcheke operasyon aritmetik ak bit, pou egzanp, ekspresyon "[] ​​% [42]" ak "$objè + 4" ap lakòz yon erè.
  • Aplike yon algorithm klasman ki estab nan ki se lòd la nan valè ki idantik konsève atravè diferan kouri.

Sous: opennet.ru

Add nouvo kòmantè