Virgole mancanti trovate nel 3.6% dei repository Python testati

Sono stati pubblicati i risultati di uno studio sulla vulnerabilità del codice Python ad errori legati all'uso errato delle virgole nel codice. I problemi sono causati dal fatto che durante l'enumerazione, Python concatena automaticamente le stringhe nell'elenco se non sono separate da una virgola, e tratta il valore come una tupla se il valore è seguito da una virgola. Dopo aver condotto un'analisi automatizzata di 666 repository GitHub con codice Python, i ricercatori hanno identificato possibili problemi con le virgole nel 5% dei progetti studiati.

Un'ulteriore ispezione manuale ha mostrato che errori reali erano presenti solo in 24 repository (3.6%) e il restante 1.4% erano falsi positivi (ad esempio, una virgola poteva essere deliberatamente omessa tra le righe per concatenare percorsi di file su più righe, hash lunghi, codici HTML blocchi o espressioni SQL). È interessante notare che tra i 24 repository con errori reali c'erano progetti di grandi dimensioni come Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield e django-helpdesk. Tuttavia, i problemi con le virgole non sono specifici di Python e spesso emergono nei progetti C/C++ (esempi di correzioni recenti sono LLVM, Mono, Tensorflow).

I principali tipi di errori studiati:

  • Manca accidentalmente una virgola in elenchi, tuple e insiemi, causando la concatenazione delle stringhe invece di essere interpretate come valori separati. Ad esempio, in Sentry, uno dei test ha mancato una virgola tra le stringhe "releases" e "discover" nell'elenco, il che ha portato a controllare un gestore "/releasesdiscover" inesistente, invece di controllare "/releases" e " /scopri" separatamente.
    Virgole mancanti trovate nel 3.6% dei repository Python testati

    Un altro esempio è che una virgola mancante in rapidpro ha causato l'unione di due regole diverse alla riga 572:

    Virgole mancanti trovate nel 3.6% dei repository Python testati

  • Una virgola mancante alla fine di una definizione di tupla a elemento singolo, che fa sì che l'assegnazione assegni un tipo regolare anziché una tupla. Ad esempio, l'espressione "valori = (1,)" risulterà in un'assegnazione a una variabile di una tupla di un elemento, ma "valori = (1)" risulterà in un'assegnazione di tipo intero. Le parentesi in queste assegnazioni non influenzano la definizione del tipo e sono facoltative, e la presenza di una tupla è determinata dal parser solo in base alla presenza di virgole. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated' # verrà assegnata una stringa invece di una tupla.) }
  • La situazione opposta sono le virgole extra durante l'assegnazione. Se viene lasciata accidentalmente una virgola alla fine di un'assegnazione, verrà assegnata una tupla come valore invece del solito tipo (ad esempio, se viene specificato "valore = 1" invece di "valore = 1").

Fonte: opennet.ru

Aggiungi un commento