3.6% testiranih Python repozitorija imalo je pogreške u nedostatku zareza

Objavljeni su rezultati istraživanja o ranjivosti Python koda na pogreške vezane uz netočnu upotrebu zareza u kodu. Problemi su uzrokovani činjenicom da prilikom nabrajanja Python automatski spaja nizove u popis ako nisu odvojeni zarezom, a također tretira vrijednost kao torku ako iza vrijednosti stoji zarez. Nakon što su proveli automatiziranu analizu 666 GitHub repozitorija s Python kodom, istraživači su identificirali moguće probleme sa zarezima u 5% proučavanih projekata.

Daljnja ručna inspekcija pokazala je da su stvarne pogreške prisutne u samo 24 repozitorija (3.6%), a preostalih 1.4% bili su lažno pozitivni (na primjer, zarez je mogao biti namjerno izostavljen između redaka kako bi se spojili putovi datoteka s više redaka, dugi hashovi, HTML blokovi ili SQL izrazi). Važno je napomenuti da su među 24 repozitorija sa stvarnim pogreš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 popravaka su LLVM, Mono, Tensorflow).

Glavne vrste proučavanih pogrešaka:

  • Slučajno nedostaje zarez u popisima, torkama i skupovima, zbog čega se nizovi spajaju umjesto da se tumače kao zasebne vrijednosti. Na primjer, u Sentryju, jedan od testova propustio je zarez između znakova "releases" i "discover" na popisu, što je rezultiralo provjerom nepostojećeg rukovatelja "/releasesdiscover", umjesto provjere "/releases" i " /otkrij" zasebno.
    3.6% testiranih Python repozitorija imalo je pogreške u nedostatku zareza

    Drugi primjer je da je nedostajući zarez u rapidprou uzrokovao spajanje dva različita pravila u retku 572:

    3.6% testiranih Python repozitorija imalo je pogreške u nedostatku zareza

  • Nedostaje zarez na kraju definicije torke od jednog elementa, zbog čega dodjela dodjeljuje regularni tip, a ne torku. Na primjer, izraz "vrijednosti = (1,)" rezultirat će dodjelom varijabli torke jednog elementa, ali "vrijednosti = (1)" rezultirat će dodjelom cjelobrojnog tipa. Zagrade u ovim dodjelama ne utječu na definiciju tipa i nisu obavezne, a prisutnost tuple određuje parser samo na temelju prisutnosti zareza. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # bit će dodijeljen niz umjesto torke. ) }
  • Suprotna situacija su dodatni zarezi tijekom dodjele. Ako se zarez slučajno ostavi na kraju dodjele, torka će biti dodijeljena kao vrijednost umjesto uobičajenog tipa (na primjer, ako je "vrijednost = 1," navedeno umjesto "vrijednost = 1").

Izvor: opennet.ru

Dodajte komentar