В 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“ и „/discover“.
    В 3.6% от тестваните Python репозитории са открити грешки, свързани с пропуснати запетаи

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

    В 3.6% от тестваните Python репозитории са открити грешки, свързани с пропуснати запетаи
  • Пропуснатата запетая в края на определение на кортеж с един елемент води до това, че при присвояване ще бъде присвоен не кортеж, а обикновен тип. Например, изразът „values = (1,)“ ще доведе до присвояване на променливата кортеж с един елемент, но „values = (1)“ ще доведе до присвояване на целочислен тип. Скобите в указаните присвоявания нямат влияние върху определението на типа и са незадължителни, а наличието на кортеж се определя от парсера само на базата на наличието на запетаи. REST_FRAMEWORK = { ‘DEFAULT_PERMISSION_CLASSES’: ( ‘rest_framework.permissions.IsAuthenticated’ # вместо кортеж ще бъде присвоена стринг. ) }
  • Обратната ситуация — излишни запетаи при присвояване. Ако в края на присвояването случайно оставите запетая, вместо обикновен тип ще бъде присвоен кортеж (например, ако вместо «value = 1» е посочено «value = 1,»).

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

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster