În 3,6% din repozitoriile Python testate au fost identificate erori legate de lipsa virgulelor.

S-au publicat rezultatele unui studiu privind susceptibilitatea codului în limbajul Python la erori legate de utilizarea incorectă a virgulilor în cod. Problemele sunt cauzate de faptul că, la enumerări, Python combină automat șirurile din listă dacă acestea nu sunt separate prin virgulă, și de asemenea, interpretează valoarea ca un tuplu dacă o virgulă urmează după valoare. După o analiză automatizată a 666 de repozitorii GitHub cu cod în Python, cercetătorii au identificat posibile probleme legate de virgule în 5% din proiectele studiate.

O verificare suplimentară manuală a arătat că erorile reale sunt prezente doar în 24 de repozitorii (3,6%), iar celelalte 1,4% sunt false alarme (de exemplu, o virgulă ar fi putut fi omisă intenționat între șiruri pentru a combina căile de fișiere împărțite pe mai multe rânduri, hash-uri lungi, blocuri HTML sau expresii SQL). Este de remarcat că, printre cele 24 de repozitorii cu erori reale, se află proiecte mari precum Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield și django-helpdesk. Problema cu virgulele nu este specifică pentru Python și apare frecvent în proiecte C/C++ (exemple recente de corecturi includ — LLVM, Mono, Tensorflow).

Principalele tipuri de erori studiate:

  • O virgulă omisă accidental în liste, tuple și seturi, care duce la combinarea șirurilor în loc de interpretarea acestora ca valori separate. De exemplu, în Sentry, într-unul dintre teste a fost omisă o virgulă între șirurile "releases" și "discover" din listă, ceea ce a dus la verificarea unui handler inexistent "/releasesdiscover", în locul verificării separate pentru "/releases" și "/discover."
    În 3,6% din repozitoriile Python testate au fost identificate erori legate de lipsa virgulelor.

    Un alt exemplu — o virgulă omisă în rapidpro a dus la combinarea a două reguli diferite pe linia 572:

    În 3,6% din repozitoriile Python testate au fost identificate erori legate de lipsa virgulelor.
  • O virgulă omisă la sfârșitul definiției unui tuplu de un singur element, ceea ce conduce la faptul că, în timpul atribuirii, se va atribui un tip obișnuit, nu un tuplu. De exemplu, expresia „values = (1,)” va atribui variabilei un tuplu de un singur element, dar „values = (1)” va duce la atribuirea unui tip întreg. Parantezele în atribuțiile specificate nu influențează definiția tipului și sunt opționale, iar existența unui tuplu este determinată de parser doar pe baza prezenței virgulelor. REST_FRAMEWORK = { ‘DEFAULT_PERMISSION_CLASSES’: ( ‘rest_framework.permissions.IsAuthenticated’ # în loc de tuplu, se va atribui un șir. ) }
  • Situația inversă — virgulă în plus la atribuiri. Dacă la sfârșitul unei atribuiri a mai rămas accidental o virgulă, atunci ca valoare va fi atribuit un tuplu în loc de un tip obișnuit (de exemplu, dacă în loc de „value = 1” se indică „value = 1,”).

Sursa: opennet.ro

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster