Sono stati pubblicati i risultati di uno studio sulla vulnerabilità del codice Python agli errori legati all'uso improprio delle virgole. I problemi sono causati dal fatto che, durante le enumerazioni, Python unisce automaticamente le stringhe in una lista se non sono separate da una virgola, e tratta il valore come una tupla se dopo il valore segue una virgola. Attraverso un'analisi automatizzata di 666 repository GitHub contenenti codice Python, i ricercatori hanno identificato possibili problemi con le virgole nel 5% dei progetti esaminati.
Un ulteriore controllo manuale ha rivelato che gli errori reali si trovano solo in 24 repository (3,6%), mentre l'1,4% restante è costituito da falsi positivi (ad esempio, una virgola potrebbe essere stata volutamente omessa tra le righe per unire percorsi di file suddivisi in più righe, lunghe stringhe hash, blocchi HTML o espressioni SQL). È interessante notare che tra i 24 repository con errori reali ci sono progetti di grandi dimensioni come Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield e django-helpdesk. Inoltre, i problemi con le virgole non sono specifici di Python e spesso emergono anche nei progetti in C/C++ (alcuni recenti correttivi includono — LLVM, Mono, Tensorflow).
Principali tipi di errori riscontrati:
- Virgola accidentalmente omessa in liste, tuple e insiemi, che porta all'unione delle stringhe invece della loro interpretazione come valori separati. Ad esempio, in Sentry, in uno dei test, era stata omessa una virgola tra le stringhe "releases" e "discover" in un elenco, il che ha portato alla verifica di un gestore inesistente "\/releasesdiscover", anziché alla verifica separata di "\/releases" e "\/discover".

Un altro esempio: la virgola omessa in rapidpro ha causato l'unione di due regole distinte nella riga 572:

- Virgola mancante alla fine della definizione di una tupla a singolo elemento, che causa un'assegnazione che non darà luogo a una tupla, ma a un tipo normale. Ad esempio, l'espressione "values = (1,)" porterà all'assegnazione alla variabile di una tupla a un elemento, mentre "values = (1)" porterà all'assegnazione di un tipo intero. Le parentesi nelle assegnazioni indicate non influiscono sulla definizione del tipo e sono facoltative; la presenza della tupla è determinata dal parser solo in base alla presenza delle virgole. REST_FRAMEWORK = { ‘DEFAULT_PERMISSION_CLASSES’: ( ‘rest_framework.permissions.IsAuthenticated’ # al posto della tupla verrà assegnata una stringa. ) }
- La situazione inversa è l'aggiunta di virgole superflue durante l'assegnazione. Se alla fine dell'assegnazione viene accidentalmente lasciata una virgola, al posto di un normale tipo verrà assegnato un tuple (ad esempio, se invece di "value = 1" si specifica "value = 1,").
Fonte: opennet.ru


