3.6% pārbaudīto Python krātuvju nebija komatu kļūdu

Publicēti pētījuma rezultāti par Python koda neaizsargātību pret kļūdām, kas saistītas ar nepareizu komatu lietošanu kodā. Problēmas rada fakts, ka uzskaitot Python automātiski saliek virknes sarakstā, ja tās nav atdalītas ar komatu, kā arī apstrādā vērtību kā korešu, ja vērtībai seko komats. Pēc 666 GitHub repozitoriju automatizētas analīzes ar Python kodu pētnieki konstatēja iespējamās komatu problēmas 5% pētīto projektu.

Turpmākā manuālā pārbaude parādīja, ka patiesas kļūdas bija tikai 24 krātuvēs (3.6%), bet atlikušie 1.4% bija kļūdaini pozitīvi (piemēram, starp rindām varēja apzināti izlaist komatu, lai savienotu vairāku rindiņu failu ceļus, garus jaucējus, HTML bloki vai SQL izteiksmes). Zīmīgi, ka starp 24 krātuvēm ar reālām kļūdām bija tādi lieli projekti kā Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield un django-helpdesk. Tomēr problēmas ar komatiem nav raksturīgas Python un bieži parādās C/C++ projektos (neseno labojumu piemēri ir LLVM, Mono, Tensorflow).

Galvenie pētīto kļūdu veidi:

  • Nejauši sarakstos, virknējumos un kopās trūkst komats, kā rezultātā virknes tiek savienotas, nevis interpretētas kā atsevišķas vērtības. Piemēram, programmā Sentry vienā no testiem sarakstā trūka komats starp virknēm "releases" un "discover", kā rezultātā tika pārbaudīts neeksistējošais "/releasesdiscover" apdarinātājs, nevis tika pārbaudīts "/releases" un " /atklājiet" atsevišķi.
    3.6% pārbaudīto Python krātuvju nebija komatu kļūdu

    Cits piemērs ir tāds, ka pazudis komats programmā rapidpro izraisīja divu dažādu kārtulu sapludināšanu 572. rindā:

    3.6% pārbaudīto Python krātuvju nebija komatu kļūdu

  • Trūkst komats viena elementa virknes definīcijas beigās, kā rezultātā piešķiršanai tiek piešķirts regulārs veids, nevis kortežs. Piemēram, izteiksme "vērtības = (1,)" radīs piešķiršanu viena elementa kortedža mainīgajam, bet "vērtības = (1)" - vesela skaitļa veida piešķiršana. Iekavas šajos uzdevumos neietekmē tipa definīciju un nav obligātas, un parsētājs nosaka kortedža klātbūtni, tikai pamatojoties uz komatu klātbūtni. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated' # tiks piešķirta virkne kortedža vietā. ) }
  • Pretēja situācija ir papildu komats uzdevuma veikšanas laikā. Ja uzdevuma beigās nejauši tiek atstāts komats, kā vērtība tiks piešķirts kortežs, nevis parastais veids (piemēram, ja "vērtība = 1" ir norādīta "vērtība = 1" vietā).

Avots: opennet.ru

Pievieno komentāru