O 3.6% dos repositorios de Python probados tiñan erros de coma

Publicáronse os resultados dun estudo sobre a vulnerabilidade do código Python ante erros relacionados co uso incorrecto das comas no código. Os problemas son causados ​​polo feito de que ao enumerar, Python concatena automaticamente as cadeas da lista se non están separadas por coma, e tamén trata o valor como unha tupla se o valor vai seguido dunha coma. Despois de realizar unha análise automatizada de 666 repositorios de GitHub con código Python, os investigadores identificaron posibles problemas de coma no 5% dos proxectos estudados.

Unha inspección manual posterior mostrou que só 24 repositorios estaban presentes erros reais (3.6%) e que o 1.4% restante eran falsos positivos (por exemplo, podíase omitir deliberadamente unha coma entre liñas para concatenar rutas de ficheiros de varias liñas, hash longos, HTML). bloques ou expresións SQL). Cabe destacar que entre os 24 repositorios con erros reais había proxectos tan grandes como Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield e django-helpdesk. Non obstante, os problemas coas comas non son específicos de Python e adoitan aparecer en proxectos C/C++ (exemplos de correccións recentes son LLVM, Mono, Tensorflow).

Principais tipos de erros estudados:

  • Falta accidentalmente unha coma en listas, tuplas e conxuntos, o que fai que as cadeas se concatenen en lugar de interpretarse como valores separados. Por exemplo, en Sentry, unha das probas perdeu unha coma entre as cadeas "releases" e "discover" na lista, o que resultou en probar un controlador "/releasesdiscover" inexistente, en lugar de marcar "/releases" e " /descubrir" por separado.
    O 3.6% dos repositorios de Python probados tiñan erros de coma

    Outro exemplo é que unha coma falta en rapidpro fixo que se fusionasen dúas regras diferentes na liña 572:

    O 3.6% dos repositorios de Python probados tiñan erros de coma

  • Falta unha coma ao final dunha definición de tupla dun só elemento, o que fai que a asignación asigne un tipo normal en lugar de unha tupla. Por exemplo, a expresión "valores = (1,)" dará lugar a unha asignación a unha variable dunha tupla dun elemento, pero "valores = (1)" dará lugar a unha asignación de tipo enteiro. Os parénteses nestas asignacións non afectan á definición do tipo e son opcionais, e a presenza dunha tupla está determinada polo analizador só en función da presenza de comas. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # asignarase unha cadea en lugar dunha tupla. ) }
  • A situación oposta son as comas extra durante a tarefa. Se se deixa unha coma accidentalmente ao final dunha asignación, asignarase unha tupla como valor en lugar do tipo normal (por exemplo, se se especifica "valor = 1", en lugar de "valor = 1").

Fonte: opennet.ru

Engadir un comentario