3.6% testiranih Python spremišta imalo je nedostajuće greške u zarezima

Objavljeni su rezultati studije o ranjivosti Python koda na greške vezane za netačnu upotrebu zareza u kodu. Problemi su uzrokovani činjenicom da pri nabrajanju Python automatski spaja nizove na listi ako nisu odvojeni zarezom, a također tretira vrijednost kao tuple ako vrijednost prati zarez. Nakon sprovođenja automatske analize 666 GitHub repozitorija sa Python kodom, istraživači su identifikovali moguće probleme sa zarezima u 5% proučavanih projekata.

Daljnja ručna inspekcija je pokazala da su stvarne greške prisutne u samo 24 spremišta (3.6%), a preostalih 1.4% su bili lažno pozitivni (na primjer, zarez se mogao namjerno izostaviti između redova radi povezivanja putanja datoteka u više redova, dugih heševa, HTML-a blokovi ili SQL izrazi). Važno je napomenuti da su među 24 spremišta sa stvarnim greškama bili tako veliki projekti kao što su Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield i django-helpdesk. Međutim, problemi sa zarezima nisu specifični za Python i često se pojavljuju u C/C++ projektima (primjeri nedavnih popravki su LLVM, Mono, Tensorflow).

Glavne vrste proučavanih grešaka:

  • Slučajno nedostaje zarez u listama, torkama i skupovima, što uzrokuje da se nizovi spajaju umjesto da se tumače kao zasebne vrijednosti. Na primjer, u Sentry, jedan od testova je propustio zarez između nizova "releases" i "discover" na listi, što je rezultiralo provjerom nepostojećeg rukovatelja "/releasesdiscover", umjesto provjere "/releases" i " /otkrijte" zasebno.
    3.6% testiranih Python spremišta imalo je nedostajuće greške u zarezima

    Drugi primjer je da je zarez koji nedostaje u rapidpro-u doveo do spajanja dva različita pravila na liniji 572:

    3.6% testiranih Python spremišta imalo je nedostajuće greške u zarezima

  • Nedostaje zarez na kraju definicije torke od jednog elementa, što uzrokuje da dodjelu dodijeli regularni tip, a ne tuple. Na primjer, izraz "vrijednosti = (1,)" će rezultirati dodjelom varijabli torke jednog elementa, ali "vrijednosti = (1)" će rezultirati dodjelom cjelobrojnog tipa. Zagrade u gornjim zadacima ne utiču na definiciju tipa i opcione su, a prisustvo tuple određuje parser samo na osnovu prisustva zareza. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # će biti dodijeljen niz umjesto tuple. ) }
  • Suprotna situacija su dodatni zarezi tokom dodjeljivanja. Ako je zarez slučajno ostavljen na kraju dodjele, tuple će biti dodijeljen kao vrijednost umjesto uobičajenog tipa (na primjer, ako je naveden “vrijednost = 1” umjesto “vrijednost = 1”).

izvor: opennet.ru

Dodajte komentar