3.6% тестираних Питхон спремишта је имало недостајуће грешке у зарезима

Објављени су резултати студије о рањивости Пајтон кода на грешке везане за нетачну употребу зареза у коду. Проблеми су узроковани чињеницом да при набрајању, Питхон аутоматски спаја стрингове на листи ако нису одвојени зарезом, а такође третира вредност као тупле ако вредност прати зарез. Након спровођења аутоматизоване анализе 666 ГитХуб спремишта са Питхон кодом, истраживачи су идентификовали могуће проблеме са зарезима у 5% проучаваних пројеката.

Даља ручна инспекција је показала да су стварне грешке биле присутне у само 24 спремишта (3.6%), а преосталих 1.4% су били лажно позитивни (на пример, зарез би могао да се намерно изостави између редова да би се повезале путање датотека у више редова, дуги хешови, ХТМЛ блокови или СКЛ изрази). Важно је напоменути да су међу 24 спремишта са стварним грешкама били тако велики пројекти као што су Тенсорфлов, Гоогле В8, Сентри, Пидата карраи, рапидпро, дјанго-цолорфиелд и дјанго-хелпдеск. Међутим, проблеми са зарезима нису специфични за Питхон и често се појављују у Ц/Ц++ пројектима (примери недавних поправки су ЛЛВМ, Моно, Тенсорфлов).

Главне врсте проучаваних грешака:

  • Случајно недостаје зарез у листама, торкама и скуповима, што доводи до тога да се стрингови спајају уместо да се тумаче као засебне вредности. На пример, у Сентри-у, један од тестова је пропустио зарез између стрингова „релеасес“ и „дисцовер“ на листи, што је резултирало провером непостојећег руковаоца „/релеасесдисцовер“, уместо провере „/релеасес“ и „ /откриј“ посебно.
    3.6% тестираних Питхон спремишта је имало недостајуће грешке у зарезима

    Други пример је да је зарез који недостаје у рапидпро-у довео до спајања два различита правила на линији 572:

    3.6% тестираних Питхон спремишта је имало недостајуће грешке у зарезима

  • Зарез недостаје на крају дефиниције једноелементне торке, што доводи до тога да додељивање додељује регуларни тип, а не торку. На пример, израз "вредности = (1,)" ће резултирати додељивањем променљиве торке једног елемента, али "вредности = (1)" ће резултирати доделом целобројног типа. Заграде у овим додељивањима не утичу на дефиницију типа и опционе су, а присуство торке одређује парсер само на основу присуства зареза. РЕСТ_ФРАМЕВОРК = { 'ДЕФАУЛТ_ПЕРМИССИОН_ЦЛАССЕС': ( 'рест_фрамеворк.пермиссионс.ИсАутхентицатед' # ће бити додељен стринг уместо тупле. )}
  • Супротна ситуација су додатни зарези током задатка. Ако је зарез случајно остављен на крају доделе, торка ће бити додељена као вредност уместо уобичајеног типа (на пример, ако је наведен „вредност = 1“ уместо „вредност = 1“).

Извор: опеннет.ру

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