S'han trobat comes que falten al 3.6% dels dipòsits Python provats

S'han publicat els resultats d'un estudi sobre la vulnerabilitat del codi Python davant errors relacionats amb l'ús incorrecte de comes al codi. Els problemes són causats pel fet que en enumerar, Python concatena automàticament les cadenes de la llista si no estan separades per una coma, i també tracta el valor com una tupla si el valor va seguit d'una coma. Després de realitzar una anàlisi automatitzada de 666 dipòsits de GitHub amb codi Python, els investigadors van identificar possibles problemes de comes en el 5% dels projectes estudiats.

Una inspecció manual posterior va mostrar que només hi havia errors reals en 24 dipòsits (3.6%), i l'1.4% restant eren falsos positius (per exemple, es podia ometre deliberadament una coma entre línies per concatenar camins de fitxers de diverses línies, hash llargs, HTML). blocs o expressions SQL). Cal destacar que entre els 24 repositoris amb errors reals hi havia projectes tan grans com Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield i django-helpdesk. Tanmateix, els problemes amb comes no són específics de Python i sovint apareixen en projectes C/C++ (exemples de correccions recents són LLVM, Mono, Tensorflow).

Els principals tipus d'errors estudiats:

  • Falta accidentalment una coma a llistes, tuples i conjunts, fet que fa que les cadenes es concatenin en lloc d'interpretar-se com a valors separats. Per exemple, a Sentry, una de les proves va perdre una coma entre les cadenes "releases" i "discover" a la llista, cosa que va donar lloc a comprovar un controlador "/releasesdiscover" inexistent, en lloc de marcar "/releases" i " /descobreix" per separat.
    S'han trobat comes que falten al 3.6% dels dipòsits Python provats

    Un altre exemple és que una coma que faltava a rapidpro va provocar que es fusionessin dues regles diferents a la línia 572:

    S'han trobat comes que falten al 3.6% dels dipòsits Python provats

  • Falta una coma al final d'una definició de tupla d'un sol element, la qual cosa fa que l'assignació assigni un tipus normal en lloc d'una tupla. Per exemple, l'expressió "valors = (1,)" donarà lloc a una assignació a una variable d'una tupla d'un element, però "valors = (1)" donarà lloc a una assignació d'un tipus enter. Els parèntesis d'aquestes assignacions no afecten la definició del tipus i són opcionals, i l'analitzador només determina la presència d'una tupla en funció de la presència de comes. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # s'assignarà una cadena en lloc d'una tupla. ) }
  • La situació contrària són comes addicionals durant l'assignació. Si es deixa accidentalment una coma al final d'una tasca, s'assignarà una tupla com a valor en lloc del tipus habitual (per exemple, si s'especifica "valor = 1", en lloc de "valor = 1").

Font: opennet.ru

Afegeix comentari