Rezultatet e kërkimit për ndjeshmërinë e kodit në gjuhën Python ndaj gabimeve të lidhura me përdorimin e gabuar të virgullave në kod janë publikuar. Problemet shkaktohen nga fakti se gjatë listave Python automatikisht bashkon vargjet në listë, nëse ato nuk ndahen me një virgull, si dhe e trajton vlerën si një tuple nëse pas vlerës ndodhet një virgull. Duke realizuar një analizë automatizuar të 666 repositorive në GitHub me kod në gjuhën Python, studiuesit zbuluan probleme të mundshme me virgullat në 5% të projekteve të studiuara.
Kontrolli i mĂ«tejshĂ«m manual tregoi se gabimet reale ndodhen vetĂ«m nĂ« 24 repositorĂ« (3.6%), ndĂ«rsa 1.4% e tjera janĂ« false pozitive (p.sh. mund tĂ« jetĂ« qĂ« njĂ« virgull Ă«shtĂ« qĂ«llimisht e lĂ«nĂ« jashtĂ« midis vargjeve pĂ«r tĂ« bashkuar rrugĂ«t e ndara tĂ« skedarĂ«ve, hash-eve tĂ« gjata, blloqeve HTML ose shprehjeve SQL). ĂshtĂ« interesante se nĂ« mesin e 24 repositorĂ«ve me gabime reale janĂ« pĂ«rfshirĂ« projekte tĂ« mĂ«dha si Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield dhe django-helpdesk. NdĂ«rkohĂ«, problemet me virgullat nuk janĂ« specifike pĂ«r Python dhe shpesh shfaqen nĂ« projekte nĂ« C/C++ (shembuj tĂ« fundit tĂ« rregullimeve â LLVM, Mono, Tensorflow).
Llojet kryesore të gabimeve të studiuara:
- Virgulla e humbur aksidentalisht në lista, tuple dhe shumësi, që çon në bashkimin e vargjeve në vend të interpretimit të tyre si vlera të ndara. Për shembull, në Sentry në një nga testet u la jashtë një virgull midis vargjeve "releases" dhe "discover" në listë, që çoi në kontrollin e një trajtuesi që nuk ekziston "\/releasesdiscover", në vend të kontrollit të ndarë "\/releases" dhe "\/discover".

Një shembull tjetër është një virgull e humbur në rapidpro që çoi në bashkimin e dy rregullave të ndryshme në vargun 572:

- Virgulla e humbur nĂ« fund tĂ« pĂ«rcaktimit tĂ« njĂ« tuple prej njĂ« elementi, qĂ« çon nĂ« faktin se gjatĂ« caktimit do tĂ« caktohet njĂ« tip normal nĂ« vend tĂ« njĂ« tuple. PĂ«r shembull, shprehja "values = (1,)" do tĂ« çojĂ« nĂ« caktimin e njĂ« variabli si njĂ« tuple prej njĂ« elementi, ndĂ«rsa "values = (1)" do tĂ« çojĂ« nĂ« caktimin e tipit tĂ« plotĂ«. ĂshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet se kornizat nĂ« caktimet e pĂ«rmendura sâkanĂ« ndikim nĂ« pĂ«rcaktimin e tipit dhe janĂ« opsionale, ndĂ«rsa ekzistenca e njĂ« tuple pĂ«rcaktohet nga parseri vetĂ«m nĂ« bazĂ« tĂ« pranisĂ« sĂ« virgullave. REST_FRAMEWORK = { âDEFAULT_PERMISSION_CLASSESâ: ( ârest_framework.permissions.IsAuthenticatedâ # nĂ« vend tĂ« njĂ« tuple, do tĂ« caktohet njĂ« varg. ) }
- Situata e kundĂ«rt â pika tĂ« tepĂ«rta gjatĂ« caktimit. NĂ«se nĂ« fund tĂ« caktimit Ă«shtĂ« lĂ«nĂ« rastĂ«sisht njĂ« pikĂ«, atĂ«herĂ« si vlerĂ« do tĂ« caktohet njĂ« tuple (pĂ«r shembull, nĂ«se nĂ« vend tĂ« «value = 1» Ă«shtĂ« shkruar «value = 1,»).
Burimi: opennet.ru


