3.6 %:ssa testatuista Python-tietovarastoista puuttui pilkkuvirheitä

Tulokset tutkimuksesta Python-koodin haavoittuvuudesta virheille, jotka liittyvät pilkkujen virheelliseen käyttöön koodissa, on julkaistu. Ongelmat johtuvat siitä, että luetteloinnissa Python ketjuttaa automaattisesti listan merkkijonot, jos niitä ei eroteta pilkulla, ja käsittelee arvoa myös monikkona, jos arvoa seuraa pilkku. Suoritettuaan automaattisen analyysin 666 GitHub-tietovarastoon Python-koodilla, tutkijat tunnistivat mahdolliset pilkkuongelmat 5 %:ssa tutkituista projekteista.

Manuaalinen lisätarkastus osoitti, että todellisia virheitä oli vain 24 tietovarastossa (3.6 %) ja loput 1.4 % olivat vääriä positiivisia (esimerkiksi pilkku voitiin tarkoituksella jättää pois rivien välistä monirivisten tiedostopolkujen, pitkien hajautusten, HTML:n yhdistämiseksi lohkot tai SQL-lausekkeet). On huomionarvoista, että 24 todellisia virheitä sisältäneen arkiston joukossa oli sellaisia ​​suuria projekteja kuin Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield ja django-helpdesk. Pilkuihin liittyvät ongelmat eivät kuitenkaan koske Pythonia, ja niitä esiintyy usein C/C++-projekteissa (esimerkkejä viimeaikaisista korjauksista ovat LLVM, Mono, Tensorflow).

Pääasialliset tutkitut virhetyypit:

  • Pilkku puuttuu vahingossa listoista, monikoista ja joukoista, jolloin merkkijonot ketjutetaan sen sijaan, että ne tulkittaisiin erillisiksi arvoiksi. Esimerkiksi Sentryssä yhdestä testistä puuttui pilkku merkkijonojen "releases" ja "discover" väliltä luettelosta, mikä johti olemattoman "/releasesdiscover" -käsittelijän tarkistamiseen sen sijaan, että olisi tarkistettu "/releases" ja " /löydä" erikseen.
    3.6 %:ssa testatuista Python-tietovarastoista puuttui pilkkuvirheitä

    Toinen esimerkki on, että rapidprossa puuttuva pilkku aiheutti kahden eri säännön yhdistämisen rivillä 572:

    3.6 %:ssa testatuista Python-tietovarastoista puuttui pilkkuvirheitä

  • Puuttuva pilkku yksialkioisen monikonmääritelmän lopusta, minkä vuoksi määritys määrittää säännöllisen tyypin monikon sijaan. Esimerkiksi lauseke "arvot = (1,)" johtaa määritykseen yhden elementin monikon muuttujalle, mutta "arvot = (1)" johtaa kokonaislukutyyppiseen määritykseen. Näissä tehtävissä olevat sulut eivät vaikuta tyypin määrittelyyn ja ovat valinnaisia, ja jäsentäjä määrittää monikon olemassaolon vain pilkkujen perusteella. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated' #:lle annetaan merkkijono monikon sijaan. ) }
  • Päinvastainen tilanne on ylimääräinen pilkku tehtävän aikana. Jos tehtävän loppuun jätetään vahingossa pilkku, arvoksi määritetään monikko tavallisen tyypin sijaan (jos esimerkiksi "arvo = 1" on määritetty "arvo = 1" sijaan).

Lähde: opennet.ru

Lisää kommentti