Липсващи запетаи са открити в 3.6% от тестваните хранилища на Python

Публикувани са резултатите от проучване за уязвимостта на кода на Python към грешки, свързани с неправилното използване на запетаи в кода. Проблемите са причинени от факта, че при изброяване Python автоматично свързва низовете в списъка, ако не са разделени със запетая, и също така третира стойността като кортеж, ако стойността е последвана от запетая. След извършване на автоматизиран анализ на 666 GitHub хранилища с код на Python, изследователите идентифицираха възможни проблеми със запетая в 5% от изследваните проекти.

Допълнителна ръчна проверка показа, че реални грешки присъстват само в 24 хранилища (3.6%), а останалите 1.4% са фалшиви положителни резултати (например може умишлено да се пропусне запетая между редовете, за да се свържат многоредови файлови пътища, дълги хешове, HTML блокове или SQL изрази). Трябва да се отбележи, че сред 24-те хранилища с реални грешки бяха такива големи проекти като Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield и django-helpdesk. Проблемите със запетаите обаче не са специфични за Python и често се появяват в C/C++ проекти (примери за скорошни корекции са LLVM, Mono, Tensorflow).

Основните видове изследвани грешки:

  • Случайно липсва запетая в списъци, кортежи и набори, което води до свързване на низове, вместо да се интерпретират като отделни стойности. Например в Sentry един от тестовете пропусна запетая между низовете „releases“ и „discover“ в списъка, което доведе до проверка на несъществуващ манипулатор „/releasesdiscover“, вместо проверка на „/releases“ и „ /открийте" отделно.
    Липсващи запетаи са открити в 3.6% от тестваните хранилища на Python

    Друг пример е, че липсваща запетая в rapidpro е причинила обединяването на две различни правила на ред 572:

    Липсващи запетаи са открити в 3.6% от тестваните хранилища на Python

  • Липсваща запетая в края на дефиниция на кортеж от един елемент, което кара присвояването да присвоява нормален тип, а не кортеж. Например, изразът "стойности = (1,)" ще доведе до присвояване на променлива на кортеж от един елемент, но "стойности = (1)" ще доведе до присвояване на целочислен тип. Скобите в тези присвоявания не влияят на дефиницията на типа и не са задължителни, а наличието на кортеж се определя от анализатора само въз основа на наличието на запетаи. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # ще бъде присвоен низ вместо кортеж. ) }
  • Обратната ситуация са допълнителни запетаи по време на присвояване. Ако случайно бъде оставена запетая в края на присвояването, кортеж ще бъде присвоен като стойност вместо обичайния тип (например, ако е посочено „стойност = 1“ вместо „стойност = 1“).

Източник: opennet.ru

Добавяне на нов коментар