Byly zveřejněny výsledky studie zaměřené na vystavenost kódu v jazyce Python chybám spojeným s nesprávným používáním čárek v kódu. Problémy jsou způsobeny tím, že při výčtech Python automaticky spojuje řetězce v seznamu, pokud nejsou odděleny čárkou, a také zpracovává hodnotu jako n-tici, pokud za hodnotou následuje čárka. Automatizovaná analýza 666 repozitářů na GitHubu s kódem v Pythonu odhalila možné problémy s čárkami v 5 % zkoumaných projektů.
Další ruční kontrola ukázala, že skutečné chyby se vyskytují pouze v 24 repozitářích (3,6 %), zatímco zbývajících 1,4 % představuje falešné poplachy (například čárka mohla být úmyslně vynechána mezi řetězci pro spojení rozdělených na několik řádků souborových cest, dlouhých hashů, bloků HTML nebo SQL výrazu). Zajímavé je, že mezi 24 repozitáři se skutečnými chybami byly i takové velké projekty jako Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield a django-helpdesk. Problémy s čárkami nejsou specifické pro Python a často se objevují v projektech v C/C++ (mezi nedávnými opravami jsou například LLVM, Mono, Tensorflow).
Hlavní typy zkoumaných chyb:
- Náhodně vynechaná čárka v seznamech, n-ticích a množinách, která vede ke spojení řetězců namísto jejich interpretace jako oddělených hodnot. Například v Sentry byl v jednom z testů vynechán čárka mezi řetězci „releases“ a „discover“ v seznamu, což vedlo k ověření neexistujícího zpracovatele „/releasesdiscover“, místo samostatného ověření „/releases“ a „/discover“.

Další příklad — vynechaná čárka v rapidpro vedla ke spojení dvou různých pravidel na řádku 572:

- Vynechaná čárka na konci definice n-tice o jednom prvku, což znamená, že při přiřazení bude přiřazena ne n-tice, ale běžný typ. Například výraz „values = (1,)“ povede k přiřazení proměnné n-tice o jednom prvku, ale „values = (1)“ povede k přiřazení celého typu. Závorky v daných přiřazeních nemají vliv na určení typu a jsou nepovinné, přičemž existenci n-tice určuje parser pouze na základě přítomnosti čárek. REST_FRAMEWORK = { ‘DEFAULT_PERMISSION_CLASSES’: ( ‘rest_framework.permissions.IsAuthenticated’ # místo n-tice bude přiřazena řetězec. ) }
- Opakovaná situace – nadbytečné čárky při přiřazení. Pokud je na konci přiřazení náhodou ponechána čárka, místo běžného typu bude přiřazen tuple (například pokud je místo „value = 1“ uvedeno „value = 1,“).
Zdroj: opennet.ru


