На 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

Додадете коментар