У 3.6% пратэставаных Python-рэпазітараў выяўлены памылкі, звязаныя з прапушчанымі коскамі.

Апублікаваны вынікі даследавання схільнасці кода на мове Python памылкам, звязаным з некарэктным выкарыстаннем косак у кодзе. Праблемы выкліканыя тым, што пры пералічэннях Python аўтаматычна аб'ядноўвае радкі ў спісе, калі яны не падзеленыя коскі, а таксама апрацоўвае значэнне як картэж, калі пасля значэння варта коска. Правёўшы аўтаматызаваны аналіз 666 GitHub-рэпазітароў з кодам на мове Python, даследнікі выявілі магчымыя праблемы з коскамі ў 5% вывучаных праектаў.

Далейшая ручная праверка паказала, што рэальныя памылкі прысутнічаюць толькі ў 24 рэпазітарах (3.6%), а астатнія 1.4% з'яўляюцца ілжывымі спрацоўваннямі (напрыклад, коска магла быць спецыяльна прапушчана паміж радкамі для аб'яднання пабітых на некалькі радкоў файлавых шляхоў, доўгіх хэшаў, HTML-блокаў або SQL-выразаў). Характэрна, што ў ліку 24 рэпазітараў з рэальнымі памылкамі аказаліся такія буйныя праекты, як Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield і django-helpdesk. Пры гэтым праблемы з коскамі не спецыфічныя для Python і часта ўсплываюць у праектах на C / C ++ (прыкладныя нядаўніх выпраўленняў – LLVM, Mono, Tensorflow).

Асноўныя віды вывучаных памылак:

  • Выпадкова прапушчаная коска ў спісах, картэжах і мноствах, якая прыводзіць да аб'яднання радкоў замест іх інтэрпрэтацыі як асобных значэнняў. Напрыклад, у Sentry у адным з тэстаў была прапушчаная коска паміж радкамі "releases" і "discover" у спісе, што прывяло да праверкі неіснуючага апрацоўшчыка "/releasesdiscover", замест паасобнай праверкі "/releases" і "/discover".
    У 3.6% пратэставаных Python-рэпазітараў выяўлены памылкі, звязаныя з прапушчанымі коскамі.

    Іншы прыклад - прапушчаная коска ў rapidpro прыводзіла да аб'яднання двух розных правілаў у радку 572:

    У 3.6% пратэставаных Python-рэпазітараў выяўлены памылкі, звязаныя з прапушчанымі коскамі.

  • Прапушчаная коска ў канцы вызначэння картэжа з аднаго элемента, якая прыводзіць да таго, што падчас прысваення будзе прысвоены не картэж, а звычайны тып. Напрыклад, выраз «values ​​= (1,)» прывядзе да прысваення зменнай картэжа з аднаго элемента, але «values ​​= (1)» прывядзе да прысваення цэлага тыпу. Дужкі ў названых прысваеннях не ўплываюць на вызначэнне тыпу і з'яўляюцца неабавязковымі, а наяўнасць картэжа вызначаецца парсерам толькі на аснове наяўнасці косак. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # замест картэжа будзе прысвоены радок. ) }
  • Зваротная сітуацыя - лішнія косы пры прысваенні. Калі ў канцы прысваення выпадкова пакінутая коска, то ў якасці значэння замест звычайнага тыпу будзе прысвоены картэж (напрыклад, калі замест "value = 1" паказана "value = 1,").

Крыніца: opennet.ru

Дадаць каментар