Објавени се резултатите од студијата за ранливоста на кодот на 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“ и „ /откриј“ одделно.
Друг пример е дека недостасува запирка во rapidpro предизвика две различни правила да се спојат на линијата 572:
- Недостасува запирка на крајот од дефиницијата за торка со еден елемент, што предизвикува задачата да додели редовен тип наместо торка. На пример, изразот „вредности = (1,)“ ќе резултира со доделување на променлива на торка од еден елемент, но „вредности = (1)“ ќе резултира со доделување на цел број тип. Заградите во овие задачи не влијаат на дефиницијата на типот и се опционални, а присуството на торка го одредува парсерот само врз основа на присуството на запирки. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( на 'rest_framework.permissions.IsAuthenticated' # ќе му биде доделена низа наместо торка. ) }
- Спротивна ситуација се дополнителни запирки за време на доделувањето. Ако случајно се остави запирка на крајот од задачата, торката ќе биде доделена како вредност наместо нормалниот тип (на пример, ако „вредност = 1“ е наведена наместо „вредност = 1“).
Извор: opennet.ru