3.6 % testovaných repozitářů Pythonu mělo chybějící čárkové chyby

Byly zveřejněny výsledky studie o zranitelnosti kódu Python vůči chybám souvisejícím s nesprávným použitím čárek v kódu. Problémy jsou způsobeny tím, že při výčtu Python automaticky zřetězí řetězce v seznamu, pokud nejsou odděleny čárkou, a také zachází s hodnotou jako s n-ticí, pokud za hodnotou následuje čárka. Po provedení automatizované analýzy 666 úložišť GitHub s kódem Python výzkumníci identifikovali možné problémy s čárkami v 5 % studovaných projektů.

Další ruční kontrola ukázala, že skutečné chyby byly přítomny pouze ve 24 úložištích (3.6 %) a zbývajících 1.4 % byly falešně pozitivní (například čárka mohla být záměrně vynechána mezi řádky pro zřetězení víceřádkových cest k souborům, dlouhé hashe, HTML bloky nebo SQL výrazy). Je pozoruhodné, že mezi 24 repozitáři se skutečnými chybami byly tak velké projekty jako Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield a django-helpdesk. Problémy s čárkami však nejsou specifické pro Python a často se objevují v projektech C/C++ (příklady nedávných oprav jsou LLVM, Mono, Tensorflow).

Hlavní typy studovaných chyb:

  • Náhodně chybí čárka v seznamech, n-ticích a sadách, což způsobuje zřetězení řetězců místo toho, aby byly interpretovány jako samostatné hodnoty. Například v Sentry jeden z testů vynechal čárku mezi řetězci „releases“ a „discover“ v seznamu, což vedlo ke kontrole neexistujícího handleru „/releasesdiscover“ namísto kontroly „/releases“ a „ /objevit" samostatně.
    3.6 % testovaných repozitářů Pythonu mělo chybějící čárkové chyby

    Dalším příkladem je, že chybějící čárka v rapidpro způsobila sloučení dvou různých pravidel na řádku 572:

    3.6 % testovaných repozitářů Pythonu mělo chybějící čárkové chyby

  • Chybějící čárka na konci definice jednoprvkové n-tice, která způsobuje přiřazení běžného typu namísto n-tice. Například výraz "values ​​​​= (1,)" bude mít za následek přiřazení k proměnné n-tice jednoho prvku, ale "values ​​​​= (1)" bude mít za následek přiřazení typu celé číslo. Závorky v těchto přiřazeních neovlivňují definici typu a jsou volitelné a přítomnost n-tice je určena analyzátorem pouze na základě přítomnosti čárek. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # bude místo n-tice přiřazen řetězec. ) }
  • Opačnou situací jsou čárky navíc při přiřazení. Pokud na konci přiřazení omylem zůstane čárka, bude jako hodnota místo obvyklého typu přiřazena n-tice (pokud je například místo „hodnota = 1“ zadáno „hodnota = 1“).

Zdroj: opennet.ru

Přidat komentář