Нашри Забур 3.12, таҳлилгари статикӣ барои забони PHP. Нашри алфа аз PHP 8.0

Ширкати Vimeo нашр шудааст нашри нави анализатори статикӣ Забур 3.12, ки ба шумо имкон медиҳад, ки хатогиҳои ошкор ва ночиз дар коди PHP ва инчунин ба таври худкор ислоҳ кардани баъзе намуди хатогиҳо. Система барои муайян кардани мушкилот ҳам дар коди кӯҳна ва ҳам дар код мувофиқ аст, ки хусусиятҳои муосири дар бахшҳои нави PHP ҷорӣшударо истифода мебарад. Рамзи лоиҳа дар PHP навишта шудааст ва паҳн мекунад таҳти иҷозатномаи MIT.

Забур аксари мушкилотеро, ки бо истифодаи нодурусти навъҳо алоқаманданд, инчунин гуногунро муайян мекунад хатогиҳои маъмулӣ. Масалан, он огоҳиҳо дар бораи омехта кардани тағирёбандаҳои намудҳои гуногун дар ифода, санҷишҳои мантиқии нодурустро дастгирӣ мекунад (масалан, "агар ($a && $a) {}", "агар ($a && !$a) {}" ва " if ( $a) {} elseif ($a) {}"), оғозкунии нопурраи хосиятҳои объект. Анализатор дар реҷаи чанд ришта кор мекунад. Сканҳои афзояндаро иҷро кардан мумкин аст, ки онҳо танҳо файлҳоеро, ки пас аз сканкунии охирин тағир ёфтаанд, таҳлил мекунанд.

Илова бар ин, воситаҳои барномасозии бехатар барои имкон фароҳам оварда шудаанд истифода баред эзоҳҳо дар формат Докблок (“/** @var Type */”) барои пешниҳоди маълумот дар бораи намудҳои тағирёбанда, арзишҳои бозгашт, параметрҳои функсия, хосиятҳои объект. Муайян кардани намунаҳои истифодаи навъи ва истифодаи изҳороти тасдиқ низ дастгирӣ карда мешавад. Барои намуна:

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

/** @var string $a */
echo strpos($a, 'салом');

/** @psalm-assert-agar-true B $a */
функсия астValidB(A $a): bool {
баргардонидани $a instance of B && $a->isValid();
}

Барои автоматикунонии рафъи мушкилоти пайдошуда, утилитаи Psalter пешниҳод шудааст, ки плагинҳо ва плагинҳоро дастгирӣ мекунад. Ин имкон медиҳад, мушкилоти коди умумиро ҳал кунед, эзоҳҳои навъиро илова кунед ва амалҳоро иҷро кунед, ба монанди интиқоли синфҳо аз як фазои ном ба фазои дигар, интиқол додани усулҳо байни синфҳо ва тағир додани номи синфҳо ва усулҳо.

Дар шумораи нави «Забур». ба амал бароварда шуд опсияи "--taint-analysis" ба шумо имкон медиҳад, ки робитаи байни параметрҳои вуруди аз корбар гирифташударо пайгирӣ кунед (масалан, $_GET['name']) ва истифодаи онҳо дар ҷойҳое, ки фирор кардани аломатҳоро талаб мекунанд (масалан, echo " $ ном "), аз ҷумла тавассути пайгирии занҷирҳои супоришҳои фосилавӣ ва зангҳои функсионалӣ. Истифодаи массивҳои ассотсиативии $_GET, $_POST ва $_COOKIE ҳамчун манбаи маълумоти эҳтимолан хатарнок ҳисобида мешавад, аммо ин ҳам имконпазир аст. муайян кардан манбаъҳои худ. Амалҳое, ки пайгирии фирорро талаб мекунанд, амалиёти баромадеро дар бар мегиранд, ки мундариҷаи HTML тавлид мекунанд, сарлавҳаҳои HTTP илова мекунанд ё дархостҳои SQL-ро иҷро мекунанд.

Санҷиш ҳангоми истифодаи функсияҳо ба монанди echo, exec, дохил ва сарлавҳа истифода мешавад. Ҳангоми таҳлили зарурати фирор, намудҳои додаҳо ба монанди матн, сатрҳо бо SQL, HTML ва коди Shell, сатрҳо бо параметрҳои аутентификатсия ба назар гирифта мешаванд. Реҷаи пешниҳодшуда ба шумо имкон медиҳад, ки осебпазирии кодро муайян кунед, ки боиси скрипти байнисоҳавӣ (XSS) ё ивазкунии SQL мешаванд.

Илова бар ин, метавон қайд кард оғоз кунед санҷиши алфа филиали нави PHP 8.0. Нашри он 26 ноябр дар назар аст. Дар филиали нав инҳо интизоранд: навовариҳо, мисли:

  • Ин имконият медиҳад Компилятори JIT, ки истифодаи он хосилнокии мехнатро баланд мебардорад.
  • таъмин намудҳои иттифоқҳо, муайян кардани коллексияҳои ду ё зиёда намуд (масалан, “функсияи ҷамъиятӣ foo(Foo|Bar $input): int|float;”).
  • таъмин атрибутҳо (эзоҳҳо), ки ба шумо имкон медиҳанд, ки метамаълумотро (ба монанди маълумоти навъи) ба синфҳо бидуни истифодаи синтаксиси Docblock пайваст кунед.
  • Синтаксиси кӯтоҳшуда таърифҳои синф, ки ба шумо имкон медиҳад, ки таърифи созанда ва хосиятҳоро якҷоя кунед.
  • Навъи нави бозгашт - статистикӣ.
  • Навъи нав - омехта, ки барои муайян кардани он ки оё функсия параметрҳои намудҳои гуногунро қабул мекунад, истифода мешавад.
  • Эзоҳ партофтан барои коркарди истисноҳо.
  • Харитаи заиф сохтани объектхое, ки хангоми чамъоварии ахлот курбони кардан мумкин аст (масалан, барои нигох доштани кэшхои нолозим).
  • Имконият бо истифода аз ифодаи “::class” барои объектҳо (аналогӣ ба даъвати get_class()).
  • Имконият таърифҳо дар блоки сайди истисноҳо, ки ба тағирёбандаҳо вобаста нестанд.
  • Имконият гузоштани вергул пас аз элементи охирин дар рӯйхати параметрҳои функсия.
  • Интерфейси нав Стрингшаванда барои муайян кардани ҳама гуна намуди сатр ё маълумоте, ки ба сатр табдил додан мумкин аст (барои он усули __toString() дастрас аст).
  • Хусусияти нав str_дарбар (), аналоги соддакардашудаи strpos барои муайян кардани пайдоиши зерсатр, инчунин функсияҳои str_starts_with() ва str_ends_with() барои тафтиши мувофиқатҳо дар аввал ва охири сатр.
  • Хусусияти иловашуда fdiv(), ки амалиёти тақсимкуниро бидуни партофтани хато ҳангоми тақсим кардан ба сифр иҷро мекунад.
  • Тағйир дода шуд мантиқи пайвастшавии сатр. Масалан, ифодаи 'echo "sum:" . $a + $b' қаблан ҳамчун "echo ("sum: " . $a) + $b' тафсир шуда буд ва дар PHP 8 ҳамчун "echo "sum: " баррасӣ карда мешавад. ($a + $b)'.
  • Сахт карда шуд тафтиши амалҳои арифметикӣ ва битӣ, масалан, ифодаҳои "[] % [42]" ва "$object + 4" боиси хатогӣ мешаванд.
  • Ба амал бароварда шуд як алгоритми мураттабсозии устувор, ки дар он тартиби арзишҳои якхела дар марҳилаҳои гуногун нигоҳ дошта мешавад.

Манбаъ: opennet.ru

Илова Эзоҳ