3.6 % išbandytų Python saugyklų trūko kablelio klaidų

Paskelbti Python kodo pažeidžiamumo dėl klaidų, susijusių su neteisingu kablelių naudojimu kode, tyrimo rezultatai. Problemos kyla dėl to, kad surašydamas Python automatiškai sujungia eilutes sąraše, jei jos nėra atskirtos kableliais, taip pat vertina reikšmę kaip eilutę, jei po reikšmės rašomas kablelis. Atlikę automatizuotą 666 GitHub saugyklų su Python kodu analizę, mokslininkai nustatė galimas kablelio problemas 5% tirtų projektų.

Tolesnis rankinis patikrinimas parodė, kad tikrų klaidų buvo tik 24 saugyklose (3.6 %), o likę 1.4 % buvo klaidingi teigiami rezultatai (pavyzdžiui, kablelis gali būti sąmoningai praleistas tarp eilučių, kad būtų sujungti kelių eilučių failų keliai, ilgos maišos, HTML blokai arba SQL išraiškos). Pastebėtina, kad tarp 24 saugyklų su realiomis klaidomis buvo tokie dideli projektai kaip Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield ir django-helpdesk. Tačiau problemos su kableliais nėra būdingos Python ir dažnai iškyla C/C++ projektuose (naujausių pataisymų pavyzdžiai yra LLVM, Mono, Tensorflow).

Pagrindiniai tirtų klaidų tipai:

  • Sąrašuose, eilėse ir rinkiniuose netyčia trūksta kablelio, todėl eilutės sujungiamos, o ne interpretuojamos kaip atskiros reikšmės. Pavyzdžiui, naudojant Sentry, vienas iš testų sąraše praleido kablelį tarp eilučių „releases“ ir „discover“, todėl buvo patikrinta neegzistuojanti tvarkytuvė „/releasesdiscover“, o ne „/releases“ ir „ /atraskite“ atskirai.
    3.6 % išbandytų Python saugyklų trūko kablelio klaidų

    Kitas pavyzdys – dėl trūkstamo kablelio rapidpro 572 eilutėje buvo sujungtos dvi skirtingos taisyklės:

    3.6 % išbandytų Python saugyklų trūko kablelio klaidų

  • Trūksta kablelio vieno elemento eilutės apibrėžimo pabaigoje, todėl priskyrimas priskiria įprastą tipą, o ne seką. Pavyzdžiui, išraiška "reikšmės = (1)" priskirs vieno elemento eilės kintamąjį, o "reikšmės = (1)" priskirs sveikojo skaičiaus tipą. Aukščiau pateiktų priskyrimų skliaustai neturi įtakos tipo apibrėžimui ir yra neprivalomi, o sektos buvimą nustato analizatorius tik pagal kablelių buvimą. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated' # bus priskirta eilutė, o ne seka. ) }
  • Priešinga situacija yra papildomi kableliai atliekant užduotį. Jei priskyrimo pabaigoje netyčia paliekamas kablelis, vietoj įprasto tipo reikšmė bus priskirta kortele (pavyzdžiui, jei vietoj „value = 1“ nurodyta „vertė = 1“).

Šaltinis: opennet.ru

Добавить комментарий