Se han publicado los resultados de un estudio sobre la susceptibilidad del código en Python a errores relacionados con el uso incorrecto de comas en el código. Los problemas se deben a que, al hacer enumeraciones, Python combina automáticamente las cadenas en una lista si no están separadas por comas, y trata el valor como una tupla si después del valor sigue una coma. Tras realizar un análisis automatizado de 666 repositorios de GitHub con código en Python, los investigadores encontraron posibles problemas con comas en el 5 % de los proyectos estudiados.
Una revisión manual posterior mostró que los errores reales solo estaban presentes en 24 repositorios (3,6 %), mientras que el 1,4 % restante eran falsos positivos (por ejemplo, la coma podría haberse omitido intencionadamente entre las cadenas para unir rutas de archivo divididas en varias líneas, hashes largos, bloques HTML o expresiones SQL). Es notable que entre los 24 repositorios con errores reales se encontraran grandes proyectos como Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield y django-helpdesk. Además, los problemas con las comas no son específicos de Python y a menudo surgen en proyectos en C/C++ (ejemplos de correcciones recientes incluyen LLVM, Mono y Tensorflow).
Principales tipos de errores estudiados:
- Coma accidentalmente omitida en listas, tuplas y conjuntos, lo que lleva a la concatenación de cadenas en lugar de interpretarlas como valores individuales. Por ejemplo, en Sentry, en una de las pruebas, se omitió una coma entre las cadenas "releases" y "discover" en la lista, lo que resultó en la verificación de un manejador inexistente "/releasesdiscover", en lugar de verificar por separado "/releases" y "/discover".

Otro ejemplo es que una coma omitida en rapidpro llevó a la fusión de dos reglas diferentes en la línea 572:

- Coma omitida al final de la definición de una tupla de un solo elemento, lo que provoca que, al asignar, se le asigne un tipo común en lugar de una tupla. Por ejemplo, la expresión "values = (1,)" resultará en la asignación de una tupla de un solo elemento a la variable, pero "values = (1)" resultará en un tipo entero. Los paréntesis en las asignaciones mencionadas no afectan la definición del tipo y son opcionales, y la presencia de una tupla se determina solo por la existencia de comas. REST_FRAMEWORK = { ‘DEFAULT_PERMISSION_CLASSES’: ( ‘rest_framework.permissions.IsAuthenticated’ # en lugar de una tupla se asignará una cadena. ) }
- La situación inversa: comas adicionales al asignar. Si al final de una asignación se deja accidentalmente una coma, en lugar de un tipo normal, se asignará una tupla (por ejemplo, si en lugar de «value = 1» se indica «value = 1,»).
Fuente: opennet.ru


