Тексерілген Python репозиторийлерінің 3.6%-ында үтір қателері жоқ

Python кодының кодта үтірлерді дұрыс қолданбаумен байланысты қателерге осалдығы туралы зерттеу нәтижелері жарияланды. Мәселелер санау кезінде Python тізімдегі жолдарды үтірмен бөлінбесе, автоматты түрде біріктіретінінен, сондай-ақ мәннен кейін үтір қойылған жағдайда мәнді кортеж ретінде қарастыратынынан туындайды. Python коды бар 666 GitHub репозиторийлерінің автоматтандырылған талдауын жүргізгеннен кейін, зерттеушілер зерттелген жобалардың 5% -ында ықтимал үтір мәселелерін анықтады.

Одан әрі қолмен тексеру нақты қателер тек 24 репозиторийде (3.6%) бар екенін көрсетті, ал қалған 1.4% жалған позитивтер (мысалы, көп жолды файл жолдарын, ұзын хэштерді, HTML файлын біріктіру үшін жолдар арасында үтірді әдейі қалдыруға болады) блоктар немесе SQL өрнектері). Бір қызығы, нақты қателері бар 24 репозиторийлердің арасында Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield және django-анықтамалық үстел сияқты ірі жобалар болған. Дегенмен, үтірлерге қатысты мәселелер Python-ға тән емес және C/C++ жобаларында жиі кездеседі (соңғы түзетулердің мысалдары LLVM, Mono, Tensorflow).

Зерттелетін қателердің негізгі түрлері:

  • Тізімдердегі, кортеждердегі және жиындардағы үтірдің кездейсоқ болмауы, жолдарды бөлек мәндер ретінде түсіндірудің орнына біріктіруге әкеледі. Мысалы, Sentry жүйесінде сынақтардың бірінде тізімдегі "шығарулар" және "дисковер" жолдары арасындағы үтір жіберіліп қалды, бұл "/ шығарылымдар" және " тексерудің орнына жоқ "/releasesdiscover" өңдеушісін тексеруге әкелді. / Discover» бөлек.
    Тексерілген Python репозиторийлерінің 3.6%-ында үтір қателері жоқ

    Тағы бір мысал, rapidpro бағдарламасында жоқ үтір екі түрлі ереженің 572-жолда біріктірілуіне себеп болды:

    Тексерілген Python репозиторийлерінің 3.6%-ында үтір қателері жоқ

  • Бір элементті кортеж анықтамасының соңындағы жетіспейтін үтір, тапсырманы кортежге емес, тұрақты түрді тағайындауға себеп болады. Мысалы, "мәндер = (1,)" өрнегі бір элементтің кортежінің айнымалы мәніне тағайындауға әкеледі, бірақ "мәндер = (1)" бүтін түрді тағайындауға әкеледі. Бұл тағайындаулардағы жақшалар типті анықтауға әсер етпейді және міндетті емес, ал кортеждің болуын талдаушы тек үтірлердің болуына қарай анықтайды. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # кортеждің орнына жол тағайындалады. ) }
  • Қарама-қарсы жағдай - тапсырма кезінде қосымша үтірлер. Тапсырманың соңында кездейсоқ үтір қалдырылса, кәдімгі түрдің орнына мән ретінде кортеж тағайындалады (мысалы, «мән = 1» орнына «мән = 1» көрсетілсе).

Ақпарат көзі: opennet.ru

пікір қалдыру