Al 3.6% de los repositorios de Python probados les faltaban errores de coma

Se han publicado los resultados de un estudio sobre la vulnerabilidad del código Python a errores relacionados con el uso incorrecto de comas en el código. Los problemas se deben al hecho de que al enumerar, Python concatena automáticamente las cadenas de la lista si no están separadas por una coma, y ​​también trata el valor como una tupla si el valor va seguido de una coma. Después de realizar un análisis automatizado de 666 repositorios de GitHub con código Python, los investigadores identificaron posibles problemas con las comas en el 5% de los proyectos estudiados.

Una inspección manual adicional mostró que había errores reales presentes en sólo 24 repositorios (3.6%), y el 1.4% restante eran falsos positivos (por ejemplo, se podría omitir deliberadamente una coma entre líneas para concatenar rutas de archivos de varias líneas, hashes largos, HTML bloques o expresiones SQL). Cabe destacar que entre los 24 repositorios con errores reales se encontraban proyectos tan grandes como Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield y django-helpdesk. Sin embargo, los problemas con las comas no son específicos de Python y a menudo surgen en proyectos C/C++ (ejemplos de correcciones recientes son LLVM, Mono, Tensorflow).

Los principales tipos de errores estudiados:

  • Falta accidentalmente una coma en listas, tuplas y conjuntos, lo que provoca que las cadenas se concatenen en lugar de interpretarse como valores separados. Por ejemplo, en Sentry, una de las pruebas omitió una coma entre las cadenas "releases" y "discover" en la lista, lo que resultó en verificar un controlador "/releasesdiscover" inexistente, en lugar de verificar "/releases" y " /descubrir" por separado.
    Al 3.6% de los repositorios de Python probados les faltaban errores de coma

    Otro ejemplo es que una coma faltante en rapidpro provocó que se fusionaran dos reglas diferentes en la línea 572:

    Al 3.6% de los repositorios de Python probados les faltaban errores de coma

  • Falta una coma al final de una definición de tupla de un solo elemento, lo que hace que la asignación asigne un tipo normal en lugar de una tupla. Por ejemplo, la expresión "valores = (1,)" dará como resultado una asignación a una variable de una tupla de un elemento, pero "valores = (1)" dará como resultado una asignación de tipo entero. Los paréntesis en estas asignaciones no afectan la definición del tipo y son opcionales, y el analizador determina la presencia de una tupla únicamente en función de la presencia de comas. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # se le asignará una cadena en lugar de una tupla. ) }
  • La situación opuesta son comas adicionales durante la asignación. Si accidentalmente se deja una coma al final de una asignación, se asignará una tupla como valor en lugar del tipo habitual (por ejemplo, si se especifica "valor = 1", en lugar de "valor = 1").

Fuente: opennet.ru

Añadir un comentario