3.6% de Python-deponejoj testitaj havis mankantajn komajn erarojn

La rezultoj de studo pri la vundebleco de Python-kodo al eraroj rilataj al la malĝusta uzo de komoj en la kodo estis publikigitaj. La problemoj estas kaŭzitaj de la fakto, ke dum enumerado, Python aŭtomate kunligas la ĉenojn en la listo se ili ne estas apartigitaj per komo, kaj ankaŭ traktas la valoron kiel opon se la valoro estas sekvata de komo. Post farado de aŭtomata analizo de 666 GitHub-deponejoj kun Python-kodo, la esploristoj identigis eblajn komojn en 5% de la studitaj projektoj.

Plia mana inspektado montris, ke realaj eraroj ĉeestis en nur 24 deponejoj (3.6%), kaj la ceteraj 1.4% estis falsaj pozitivoj (ekzemple, komo povus esti intence preterlasita inter linioj por kunligi plurliniajn dosiervojojn, longajn hashojn, HTML). blokoj aŭ SQL-esprimoj). Estas rimarkinde, ke inter la 24 deponejoj kun realaj eraroj estis tiaj grandaj projektoj kiel Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield kaj django-helpdesk. Tamen, problemoj kun komoj ne estas specifaj por Python kaj ofte aperas en C/C++-projektoj (ekzemploj de lastatempaj korektoj estas LLVM, Mono, Tensorflow).

La ĉefaj specoj de eraroj studitaj:

  • Hazarde mankas komo en listoj, opoj kaj aroj, kaŭzante ŝnurojn kunligitaj anstataŭ esti interpretitaj kiel apartaj valoroj. Ekzemple, en Sentry, unu el la testoj maltrafis komon inter la ĉenoj "releases" kaj "discover" en la listo, kio rezultigis kontroli neekzistantan "/releasesdiscover" pritraktilon, anstataŭ kontroli "/releases" kaj " /malkovru" aparte.
    3.6% de Python-deponejoj testitaj havis mankantajn komajn erarojn

    Alia ekzemplo estas ke mankanta komo en rapidpro kaŭzis du malsamajn regulojn esti kunfanditaj sur linio 572:

    3.6% de Python-deponejoj testitaj havis mankantajn komajn erarojn

  • Mankanta komo ĉe la fino de unuelementa opodifino, igante la taskon atribui regulan tipon prefere ol opon. Ekzemple, la esprimo "valoroj = (1,)" rezultigos asignon al variablo de opo de unu elemento, sed "valoroj = (1)" rezultigos asignon de entjera tipo. La krampoj en ĉi tiuj taskoj ne influas la tipdifinon kaj estas laŭvolaj, kaj la ĉeesto de opo estas determinita de la analizilo nur surbaze de la ĉeesto de komoj. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # estos asignita ĉeno anstataŭ opo. ) }
  • La mala situacio estas ekstraj komoj dum tasko. Se komo estas hazarde lasita ĉe la fino de tasko, opo estos asignita kiel la valoro anstataŭ la kutima tipo (ekzemple, se "valoro = 1", estas specifita anstataŭ "valoro = 1").

fonto: opennet.ru

Aldoni komenton