3.6 % testiranih repozitorijev Python je imelo napake z manjkajočo vejico

Objavljeni so rezultati študije o ranljivosti kode Python na napake, povezane z nepravilno uporabo vejic v kodi. Težave povzroča dejstvo, da Python pri naštevanju samodejno združi nize v seznamu, če niso ločeni z vejico, in tudi obravnava vrednost kot tuple, če vrednosti sledi vejica. Po izvedbi avtomatizirane analize 666 repozitorijev GitHub s kodo Python so raziskovalci odkrili morebitne težave z vejico pri 5 % proučevanih projektov.

Nadaljnji ročni pregled je pokazal, da so bile resnične napake prisotne le v 24 repozitorijih (3.6 %), preostalih 1.4 % pa je bilo lažno pozitivnih (na primer, med vrsticami je bila lahko namerno izpuščena vejica, da bi združili večvrstične poti datotek, dolge zgoščene vrednosti, HTML bloki ali izrazi SQL). Omeniti velja, da so bili med 24 repozitoriji z resničnimi napakami tako veliki projekti, kot so Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield in django-helpdesk. Vendar težave z vejicami niso specifične za Python in se pogosto pojavijo v projektih C/C++ (primeri nedavnih popravkov so LLVM, Mono, Tensorflow).

Glavne vrste preučevanih napak:

  • Nenamerno manjka vejica na seznamih, tupleh in nizih, zaradi česar so nizi povezani, namesto da bi bili interpretirani kot ločene vrednosti. Na primer, v Sentryju je eden od testov zgrešil vejico med nizoma »releases« in »discover« na seznamu, kar je povzročilo preverjanje neobstoječega upravljalnika »/releasesdiscover«, namesto preverjanja »/releases« in » /discover" ločeno.
    3.6 % testiranih repozitorijev Python je imelo napake z manjkajočo vejico

    Drug primer je, da je manjkajoča vejica v rapidpro povzročila združitev dveh različnih pravil v vrstici 572:

    3.6 % testiranih repozitorijev Python je imelo napake z manjkajočo vejico

  • Manjkajoča vejica na koncu definicije tuple z enim elementom, zaradi česar dodelitev dodeli običajni tip in ne tuple. Na primer, izraz "vrednosti = (1,)" bo imel za posledico dodelitev spremenljivki tuple enega elementa, "vrednosti = (1)" pa bo imel za posledico dodelitev celoštevilskega tipa. Oklepaji v teh dodelitvah ne vplivajo na definicijo tipa in so izbirni, prisotnost tuple pa določi razčlenjevalnik samo na podlagi prisotnosti vejic. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # bo dodeljen niz namesto tuple. ) }
  • Nasprotna situacija so dodatne vejice med dodelitvijo. Če na koncu dodelitve pomotoma pustite vejico, bo kot vrednost namesto običajnega tipa dodeljena torka (če je na primer »vrednost = 1« podana namesto »vrednost = 1«).

Vir: opennet.ru

Dodaj komentar