Lipsesc virgule găsite în 3.6% dintre depozitele Python testate

Au fost publicate rezultatele unui studiu privind vulnerabilitatea codului Python la erori legate de utilizarea incorectă a virgulelor în cod. Problemele sunt cauzate de faptul că la enumerare, Python concatenează automat șirurile din listă dacă nu sunt separate prin virgulă și, de asemenea, tratează valoarea ca un tuplu dacă valoarea este urmată de o virgulă. După ce au efectuat o analiză automată a 666 de depozite GitHub cu cod Python, cercetătorii au identificat posibile probleme de virgulă în 5% dintre proiectele studiate.

O inspecție manuală ulterioară a arătat că erori reale au fost prezente în doar 24 de depozite (3.6%), iar restul de 1.4% au fost fals pozitive (de exemplu, virgula ar putea fi omisă în mod deliberat între linii pentru a concatena căile fișierelor cu mai multe linii, hashuri lungi, HTML). blocuri sau expresii SQL). Este de remarcat faptul că printre cele 24 de depozite cu erori reale au fost proiecte atât de mari precum Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield și django-helpdesk. Cu toate acestea, problemele cu virgulele nu sunt specifice lui Python și apar adesea în proiectele C/C++ (exemple de remedieri recente sunt LLVM, Mono, Tensorflow).

Principalele tipuri de erori studiate:

  • Lipsește accidental o virgulă în liste, tupluri și seturi, ceea ce face ca șirurile de caractere să fie concatenate în loc să fie interpretate ca valori separate. De exemplu, în Sentry, unul dintre teste a omis o virgulă între șirurile „releases” și „discover” din listă, ceea ce a dus la verificarea unui handler „/releasesdiscover” inexistent, în loc să bifeze „/releases” și „ /descoperire" separat.
    Lipsesc virgule găsite în 3.6% dintre depozitele Python testate

    Un alt exemplu este că o virgulă lipsă în rapidpro a făcut ca două reguli diferite să fie îmbinate pe linia 572:

    Lipsesc virgule găsite în 3.6% dintre depozitele Python testate

  • O virgulă lipsă la sfârșitul unei definiții de tuplu cu un singur element, determinând atribuirea unui tip obișnuit mai degrabă decât a unui tuplu. De exemplu, expresia „valori = (1,)” va avea ca rezultat o atribuire unei variabile a unui tuplu de un element, dar „valori = (1)” va avea ca rezultat o atribuire de tip întreg. Parantezele din aceste atribuiri nu afectează definiția tipului și sunt opționale, iar prezența unui tuplu este determinată de parser numai pe baza prezenței virgulelor. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # va primi un șir în loc de un tuplu. ) }
  • Situația opusă este virgulele suplimentare în timpul sarcinii. Dacă o virgulă este lăsată accidental la sfârșitul unei atribuiri, un tuplu va fi atribuit ca valoare în loc de tipul obișnuit (de exemplu, dacă „valoare = 1,” este specificat în loc de „valoare = 1”).

Sursa: opennet.ru

Adauga un comentariu