3,6%-l Pythoni hoidlatest leiti vigu, mis on seotud puuduolevate komadega

Avaldati tulemused uuringust, mis käsitleb Python-koodi kallutatust vigadele, mis on seotud komade vale kasutamisega koodis. Probleemid tulenevad sellest, et Python ühendab automaatselt loendis olevad stringid, kui need ei ole komaga eraldatud, ning käsitleb väärtust tuple'ina, kui väärtuse järel on koma. Automatiseeritud analüüsi käigus analüüsiti 666 GitHubi hoidlat Python-koodiga, mille käigus tuvastasid teadlased võimalikud komade probleemid 5% uuritud projektidest.

Edasi liikudes käsitsi kontrollimine näitas, et tegelikke vigu esineb vaid 24 hoidlas (3.6%), samas kui ülejäänud 1.4% on valehäired (näiteks võis olla teadlikult vahele jäetud koma failiteede, pika hash'i, HTML-blokkide või SQL-väljendite eraldamiseks). Pidage meeles, et nende 24 reaalse vea hulka kuuluvad suured projektid nagu Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield ja django-helpdesk. Samuti ei ole koma probleemid spetsiifilised Pythonile ja esinevad sageli C/C++ projektides (hiljutised parandused — LLVM, Mono, Tensorflow).

Peamised uuritud vigade tüübid:

  • Juhuslikult vahele jäetud koma loendites, tupikutes ja kogudes, mis viib ridade ühendamiseni, selle asemel et tõlgendada neid eraldi väärtustena. Näiteks Sentry puhul üks testides jäeti vahele koma ridade vahel 'releases' ja 'discover' loendis, mis viis mitteeksisteeriva töötleja '/releasesdiscover' kontrollimise asemel eraldi kontrollimisele '/releases' ja '/discover'.
    3,6%-l Pythoni hoidlatest leiti vigu, mis on seotud puuduolevate komadega

    Teine näide — vahele jäetud koma rapidpro's viis kahe erineva reegli ühendamiseni real 572:

    3,6%-l Pythoni hoidlatest leiti vigu, mis on seotud puuduolevate komadega
  • Ühe elemendi tupeldamise määratlemise lõpus puuduv koma, mis põhjustab, et jagamisel antakse mitte tupel, vaid tavaline tüüp. Näiteks väljend "values = (1,)" määrab muutuja ühe elemendi tupel, kuid "values = (1)" määrab täisarvu tüübi. Ülevaateid antud määratlustes ei mõjuta ja need on valikulised, samas kui tupeli olemasolu määrates määrab parser ainult komade olemasolu. REST_FRAMEWORK = { ‘DEFAULT_PERMISSION_CLASSES’: ( ‘rest_framework.permissions.IsAuthenticated’ # tupelile antakse string. ) }
  • Tagurpidi olukord — liigsed komad määramises. Kui määramise lõpus on kogemata jäänud koma, siis antakse väärtusena tavalisest tüübist tupel (näiteks kui "value = 1" asemel on kirjutatud "value = 1,").

Allikas: opennet.ru

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster