Janë publikuar rezultatet e një studimi mbi ndjeshmërinë e kodit në gjuhën Python ndaj gabimeve të lidhura me përdorimin e gabuar të presjeve në kod. Problemet shkaktohen nga fakti se kur ka lista, Python automatikisht bashkon stringjet në listë nëse ato nuk ndahen me presje, dhe gjithashtu e trajton vlerën si një tuple nëse pas vlerës ndodhet një presje. Pas një analize automatizimi të 666 depove në GitHub me kod në gjuhën Python, studiuesit identifikuan probleme të mundshme me presjet në 5% të projekteve të studiuara.
Kontrolli i mĂ«tejshĂ«m manual tregoi se gabimet reale janĂ« tĂ« pranishme vetĂ«m nĂ« 24 depo (3.6%), ndĂ«rsa 1.4% e tjera janĂ« alarmet false (p.sh., presja mund tĂ« jetĂ« lĂ«nĂ« qĂ«llimisht jashtĂ« midis stringjeve pĂ«r tĂ« bashkuar rrugĂ«t e skedarĂ«ve tĂ« ndara nĂ« disa rreshta, hash-e tĂ« gjata, blloqe HTML ose shprehje SQL). Ajo qĂ« Ă«shtĂ« e veçantĂ« Ă«shtĂ« se mes 24 depove me gabime reale ka projekte tĂ« mĂ«dha si Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield dhe django-helpdesk. Gjithashtu, problemet me presjet nuk janĂ« specifike pĂ«r Python dhe shpesh shfaqen nĂ« projekte nĂ« C/C++ (shembuj i korrigjimeve tĂ« fundit â LLVM, Mono, Tensorflow).
Llojet kryesore të gabimeve të studiuara:
- Një presje e lënë rastësisht jashtë në lista, tuple dhe conjunto, që çon në bashkimin e stringjeve në vend që të interpretohen si vlera të veçanta. Për shembull, në Sentry, në një nga testet, një presje ishte lënë jashtë midis stringjeve 'releases' dhe 'discover' në listë, çka solli verifikimin e një trajtuesi joekzistues '/releasesdiscover', në vend të verifikimit të ndarë '/releases' dhe '/discover'.

NjĂ« shembull tjetĂ«r â njĂ« presje e lĂ«nĂ« jashtĂ« nĂ« rapidpro çoi nĂ« bashkimin e dy rregullave tĂ« ndryshme nĂ« rreshtin 572:

- Një presje e lënë jashtë në fund të një përcaktimi të tuple nga një element, që çon në faktin se gjatë caktimit do të caktohet një tip normal dhe jo një tuple. Për shembull, shprehja 'values = (1,)' do të sjellë caktimin e një tuple nga një element, por 'values = (1)' do të sjellë cakimin e një tipi të plotë. Vargjet në caktimet e sipërpërmendura nuk ndikojnë në definimin e tipit dhe janë të opsionaleshme, ndërsa prania e një tuple përcaktohet nga parseri vetëm në bazë të pranisë së presjeve. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # në vend të një tuple do të caktohet një string. ) }
- Situata e kundĂ«rt â presje tĂ« tepĂ«rta gjatĂ« caktimit. NĂ«se nĂ« fund tĂ« caktimit Ă«shtĂ« lĂ«nĂ« rastĂ«sisht njĂ« presje, atĂ«herĂ« si vlerĂ« do tĂ« caktohet njĂ« tuple nĂ« vend tĂ« njĂ« tipi normal (p.sh., nĂ«se nĂ« vend tĂ« 'value = 1' Ă«shtĂ« vendosur 'value = 1,').
Burimi: opennet.ru


