3.6 % des référentiels Python testés comportaient des erreurs de virgule manquantes

Les résultats d'une étude sur la vulnérabilité du code Python aux erreurs liées à l'utilisation incorrecte des virgules dans le code ont été publiés. Les problèmes sont dus au fait que lors de l'énumération, Python concatène automatiquement les chaînes de la liste si elles ne sont pas séparées par une virgule, et traite également la valeur comme un tuple si la valeur est suivie d'une virgule. Après avoir effectué une analyse automatisée de 666 référentiels GitHub avec du code Python, les chercheurs ont identifié d'éventuels problèmes de virgules dans 5 % des projets étudiés.

Une inspection manuelle plus approfondie a montré que de véritables erreurs étaient présentes dans seulement 24 référentiels (3.6 %), et que les 1.4 % restants étaient des faux positifs (par exemple, une virgule pouvait être délibérément omise entre les lignes pour concaténer des chemins de fichiers multilignes, des hachages longs, des fichiers HTML). blocs ou expressions SQL). Il est à noter que parmi les 24 référentiels comportant de réelles erreurs figuraient des projets aussi importants que Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield et django-helpdesk. Cependant, les problèmes avec les virgules ne sont pas spécifiques à Python et surviennent souvent dans les projets C/C++ (des exemples de correctifs récents sont LLVM, Mono, Tensorflow).

Les principaux types d’erreurs étudiés :

  • Manque accidentellement une virgule dans les listes, les tuples et les ensembles, ce qui entraîne la concaténée des chaînes au lieu d'être interprétées comme des valeurs distinctes. Par exemple, dans Sentry, l'un des tests manquait une virgule entre les chaînes "releases" et "discover" dans la liste, ce qui entraînait la vérification d'un gestionnaire "/releasesdiscover" inexistant, au lieu de vérifier "/releases" et " /découvrir" séparément.
    3.6 % des référentiels Python testés comportaient des erreurs de virgule manquantes

    Un autre exemple est qu'une virgule manquante dans rapidpro a provoqué la fusion de deux règles différentes sur la ligne 572 :

    3.6 % des référentiels Python testés comportaient des erreurs de virgule manquantes

  • Une virgule manquante à la fin d'une définition de tuple à un seul élément, ce qui oblige l'affectation à attribuer un type régulier plutôt qu'un tuple. Par exemple, l'expression « valeurs = (1,) » entraînera une affectation à une variable d'un tuple d'un élément, mais « valeurs = (1) » entraînera une affectation d'un type entier. Les parenthèses dans ces affectations n'affectent pas la définition du type et sont facultatives, et la présence d'un tuple est déterminée par l'analyseur uniquement en fonction de la présence de virgules. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # se verra attribuer une chaîne au lieu d'un tuple. ) }
  • La situation inverse est celle des virgules supplémentaires pendant l'affectation. Si une virgule est accidentellement laissée à la fin d'une affectation, un tuple sera attribué comme valeur au lieu du type habituel (par exemple, si « valeur = 1 » est spécifié au lieu de « valeur = 1 »).

Source: opennet.ru

Ajouter un commentaire