3.6% testitud Pythoni hoidlates puudusid koma vead

Avaldatud on uuringu tulemused Pythoni koodi haavatavuse kohta koodis ebaõige koma kasutamisega seotud vigade suhtes. Probleemid on põhjustatud sellest, et loendamisel ühendab Python automaatselt loendis olevad stringid, kui need pole komaga eraldatud, ning käsitleb väärtust ka korteegina, kui väärtusele järgneb koma. Pärast Pythoni koodiga 666 GitHubi hoidla automatiseeritud analüüsi läbiviimist tuvastasid teadlased võimalikud komaprobleemid 5% uuritud projektidest.

Täiendav käsitsi kontrollimine näitas, et tõelisi vigu esines vaid 24 hoidlas (3.6%) ja ülejäänud 1.4% olid valepositiivsed (näiteks võib ridade vahelt koma tahtlikult välja jätta, et liita mitmerealised failiteed, pikad räsid, HTML plokid või SQL-avaldised). Tähelepanuväärne on, et 24 reaalsete vigadega hoidla hulgas olid sellised suured projektid nagu Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield ja django-helpdesk. Kuid komadega seotud probleemid ei ole Pythoni spetsiifilised ja need ilmnevad sageli C/C++ projektides (hiljutiste paranduste näited on LLVM, Mono, Tensorflow).

Peamised uuritud vigade tüübid:

  • Kogemata puudub loendites, korteežides ja komplektides koma, mis põhjustab stringide ühendamise, selle asemel, et neid tõlgendada eraldi väärtustena. Näiteks Sentry's jäi ühes testis loendist välja koma stringide "releases" ja "discover" vahel, mille tulemusena kontrolliti "/releasesdiscover" töötlejat olematu, selle asemel et kontrollida "/releases" ja " /discover" eraldi.
    3.6% testitud Pythoni hoidlates puudusid koma vead

    Teine näide on see, et rapidpro puuduv koma põhjustas real 572 kahe erineva reegli liitmise:

    3.6% testitud Pythoni hoidlates puudusid koma vead

  • Puuduv koma üheelemendilise korteeži definitsiooni lõpus, mistõttu määramine määrab korrutise asemel tavalise tüübi. Näiteks avaldis "values ​​​​= (1,)" annab ühe elemendi korteeži muutujale omistamise, kuid "väärtused = (1)" annab tulemuseks täisarvu tüüpi määramise. Nendes ülesannetes olevad sulud ei mõjuta tüübimääratlust ja on valikulised ning parser määrab korteeži olemasolu ainult komade olemasolu põhjal. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated' # määratakse korteeži asemel string. ) }
  • Vastupidine olukord on lisakoma määramise ajal. Kui ülesande lõppu jäetakse kogemata koma, määratakse tavapärase tüübi asemel väärtuseks korteež (näiteks kui väärtus = 1 on määratud väärtuse "value = 1" asemel).

Allikas: opennet.ru

Lisa kommentaar