PHP хэлний статик анализатор Дуулал 3.12 хувилбар. PHP 8.0-ийн альфа хувилбар

Vimeo компани Нийтлэгдсэн статик анализаторын шинэ хувилбар Дуулал 3.12, энэ нь PHP кодын тодорхой болон нарийн алдааг тодорхойлох, мөн зарим төрлийн алдааг автоматаар засах боломжийг олгодог. Энэхүү систем нь хуучин код болон PHP-ийн шинэ салбаруудад нэвтрүүлсэн орчин үеийн функцуудыг ашигладаг кодын аль алинд нь асуудлуудыг тодорхойлоход тохиромжтой. Төслийн кодыг PHP болон тараасан MIT лицензийн дагуу.

Дуулал нь төрөл бүрийн буруу хэрэглээтэй холбоотой ихэнх асуудлуудыг тодорхойлдог ердийн алдаанууд. Жишээлбэл, энэ нь илэрхийлэлд янз бүрийн төрлийн хувьсагчдыг холих, буруу логик тестүүд ("if ($a && $a) {}", "if ($a && !$a) {}" болон " гэх мэт) анхааруулгыг дэмждэг. if ( $a) {} elseif ($a) {}"), объектын шинж чанарыг бүрэн эхлүүлээгүй. Анализатор нь олон урсгалтай горимд ажилладаг. Зөвхөн сүүлийн скан хийснээс хойш өөрчлөгдсөн файлуудад дүн шинжилгээ хийдэг нэмэлт скан хийх боломжтой.

Нэмж хэлэхэд, зөвшөөрөхийн тулд аюулгүй програмчлалын хэрэгслүүдээр хангагдсан ашиглах хэлбэрээр тэмдэглэгээ Docblock (“/** @var Type */”) хувьсагчийн төрлүүд, буцаах утга, функцын параметрүүд, объектын шинж чанаруудын талаар мэдээлэл өгөх. Төрөл хэрэглээний хэв маягийг тодорхойлох, баталгаажуулах мэдэгдлийг ашиглах нь бас дэмжигддэг. Жишээлбэл:

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

/** @var мөр $a */
echo strpos($a, 'сайн уу');

/** @psalm-assert-if-true B $a */
функц ньValidB(A $a): bool {
буцаах $a instanceof B && $a->isValid();
}

Олдсон асуудлуудыг автоматжуулахын тулд залгаасуудыг дэмждэг Psalter хэрэгслийг өгсөн болно. Энэ нь олгодог нийтлэг кодын асуудлуудыг олж засварлах, төрлийн тэмдэглэгээ нэмэх, ангиудыг нэг нэрийн орон зайгаас нөгөөд шилжүүлэх, ангиудын хооронд аргуудыг шилжүүлэх, анги болон аргуудын нэрийг өөрчлөх зэрэг үйлдлийг гүйцэтгэх.

Дуулал номын шинэ дугаарт хэрэгжүүлсэн "--taint-analysis" сонголт нь хэрэглэгчээс хүлээн авсан оролтын параметрүүд (жишээ нь, $_GET['name']) болон тэмдэгтээс зугтах шаардлагатай газруудад тэдгээрийн ашиглалтын хоорондын хамаарлыг хянах боломжийг олгодог (жишээлбэл, echo " $ нэр "), үүнд завсрын даалгавар, функцийн дуудлагыг хянах гинжээр дамжуулан. $_GET, $_POST болон $_COOKIE ассоциатив массивуудыг ашиглах нь аюултай өгөгдлийн эх үүсвэр гэж тооцогддог боловч бас боломжтой. тодорхойлолт өөрийн эх сурвалж. Орхихыг хянах шаардлагатай үйлдлүүд нь HTML контент үүсгэх, HTTP толгойг нэмэх эсвэл SQL асуулга гүйцэтгэх гаралтын үйлдлүүд орно.

Баталгаажуулалтыг echo, exec, include, header зэрэг функцуудыг ашиглах үед ашигладаг. Зугтах хэрэгцээг шинжлэхдээ текст, SQL, HTML, Shell код бүхий мөр, баталгаажуулалтын параметр бүхий мөр зэрэг өгөгдлийн төрлийг харгалзан үздэг. Санал болгож буй горим нь сайт хоорондын скрипт (XSS) эсвэл SQL орлуулалтад хүргэдэг кодын эмзэг байдлыг тодорхойлох боломжийг танд олгоно.

Нэмж дурдахад үүнийг тэмдэглэж болно эхлэл шинэ PHP 8.0 салбарын альфа тест. 26-р сарын XNUMX-нд гаргахаар төлөвлөж байна. Шинэ салбараас дараахь зүйлийг хүлээж байна. инновациЖишээ нь:

  • Оруулах JIT хөрвүүлэгч, үүнийг ашигласнаар бүтээмж дээшилнэ.
  • тусламж эвлэлийн төрлүүд, хоёр буюу түүнээс дээш төрлийн цуглуулгуудыг тодорхойлох (жишээлбэл, “нийтийн функц foo(Foo|Bar $input): int|float;”).
  • тусламж шинж чанарууд Docblock синтакс ашиглахгүйгээр мета өгөгдлийг (төрлийн мэдээлэл гэх мэт) ангиудтай холбох боломжийг олгодог (тэмдэглэгээ).
  • Богиночилсан синтакс Ангийн тодорхойлолтууд нь бүтээгч болон шинж чанаруудын тодорхойлолтыг нэгтгэх боломжийг олгодог.
  • Шинэ буцах төрөл - статик.
  • Шинэ төрөл - холимог, функц нь өөр өөр төрлийн параметрүүдийг хүлээн авах эсэхийг тодорхойлоход ашиглаж болно.
  • Үг хэлэх хаях үл хамаарах зүйлсийг зохицуулах.
  • Сул газрын зураг хог цуглуулах явцад золиослох боломжтой объектуудыг бий болгох (жишээлбэл, шаардлагагүй кэш хадгалах).
  • Боломж объектын хувьд “::class” илэрхийллийг ашиглан (get_class() дуудахтай адил).
  • Боломж хувьсагчдад үл хамаарах үл хамаарах зүйлсийн catch блок дахь тодорхойлолтууд.
  • Боломж функцийн параметрийн жагсаалтын сүүлчийн элементийн ард таслал үлдээнэ.
  • Шинэ интерфейс Утастай тэмдэгт мөр болгон хувиргаж болох аливаа мөрийн төрөл эсвэл өгөгдлийг тодорхойлох (үүнд __toString() аргыг ашиглах боломжтой).
  • Шинэ шинж тэмдэг str_contains(), дэд мөр үүсэхийг тодорхойлоход зориулсан strpos-ийн хялбаршуулсан аналог, мөн мөрийн эхэн ба төгсгөлд тохирохыг шалгах str_starts_with() болон str_ends_with() функцууд.
  • Нэмэлт функц fdiv(), тэгээр хуваахад алдаа гаргахгүйгээр хуваах үйлдлийг гүйцэтгэдэг.
  • Өөрчлөгдсөн стринг холбох логик. Жишээ нь, илэрхийлэл 'echo "sum:" . $a + $b'-г өмнө нь 'echo ("sum: " . $a) + $b' гэж тайлбарлаж байсан ба PHP 8-д 'echo "sum:" гэж ажиллах болно. ($a + $b)'.
  • Чанасан арифметик болон битийн үйлдлүүдийг шалгах, жишээлбэл, "[] % [42]" ба "$объект + 4" илэрхийлэл нь алдаа гаргах болно.
  • Хэрэгжүүлсэн ижил утгуудын дарааллыг өөр өөр гүйдлээр хадгалдаг тогтвортой эрэмбэлэх алгоритм.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх