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-helpdesk: Այնուամենայնիվ, ստորակետների հետ կապված խնդիրները հատուկ չեն Python-ին և հաճախ հայտնվում են C/C++ նախագծերում (վերջին ուղղումների օրինակներ են՝ LLVM, Mono, Tensorflow):

Ուսումնասիրված սխալների հիմնական տեսակները.

  • Ցանկերում, բազմոցներում և բազմություններում պատահաբար բացակայում է ստորակետը, ինչը հանգեցնում է տողերի միացմանը՝ որպես առանձին արժեքներ մեկնաբանելու փոխարեն: Օրինակ, Sentry-ում թեստերից մեկը բաց թողեց ստորակետը ցուցակի «releases» և «discover» տողերի միջև, ինչի արդյունքում փորձարկվեց գոյություն չունեցող «/releasesdiscover» մշակիչը՝ «/releases» և «» ստուգման փոխարեն: /բացահայտել» առանձին:
    Python-ի փորձարկված պահոցների 3.6%-ում բացակայում էին ստորակետերի սխալները

    Մեկ այլ օրինակ այն է, որ rapidpro-ում բացակայող ստորակետը հանգեցրել է 572 տողում երկու տարբեր կանոնների միավորմանը.

    Python-ի փորձարկված պահոցների 3.6%-ում բացակայում էին ստորակետերի սխալները

  • Մեկ տարրից բաղկացած tuple սահմանման վերջում բացակայում է ստորակետ, որը ստիպում է հանձնարարությանը վերագրել սովորական տիպ, այլ ոչ թե բազմակի: Օրինակ, «արժեքներ = (1,)» արտահայտությունը կհանգեցնի մեկ տարրի բազմակի փոփոխականին վերագրմանը, բայց «արժեքներ = (1)» կհանգեցնի ամբողջ թվի տիպի նշանակմանը: Այս հանձնարարությունների փակագծերը չեն ազդում տիպի սահմանման վրա և ընտրովի են, իսկ բազմակի առկայությունը որոշվում է վերլուծողի կողմից միայն ստորակետերի առկայության հիման վրա: REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES'. ( 'rest_framework.permissions.IsAuthenticated' #-ին վերագրվելու է տող՝ բազմակի փոխարեն: ) }
  • Հակառակ իրավիճակը հանձնարարության ժամանակ լրացուցիչ ստորակետներն են: Եթե ​​հանձնարարության վերջում պատահաբար ստորակետ է թողնվել, ապա սովորական տիպի փոխարեն որպես արժեք կնշանակվի բազմակի արժեք (օրինակ, եթե «արժեք = 1» նշված է «արժեք = 1»-ի փոխարեն):

Source: opennet.ru

Добавить комментарий