3.6 % testovaných repozitárov Pythonu malo chýbajúce chyby čiarkou

Boli zverejnené výsledky štúdie o zraniteľnosti kódu Python voči chybám súvisiacim s nesprávnym používaním čiarok v kóde. Problémy spôsobuje fakt, že pri enumerácii Python automaticky zreťazí reťazce v zozname, ak nie sú oddelené čiarkou, a tiež zaobchádza s hodnotou ako s n-ticou, ak za hodnotou nasleduje čiarka. Po vykonaní automatizovanej analýzy 666 úložísk GitHub s kódom Python výskumníci identifikovali možné problémy s čiarkami v 5 % študovaných projektov.

Ďalšia manuálna kontrola ukázala, že skutočné chyby boli prítomné iba v 24 úložiskách (3.6 %) a zvyšných 1.4 % boli falošne pozitívne (napríklad čiarka mohla byť zámerne vynechaná medzi riadkami, aby sa spojili viacriadkové cesty k súborom, dlhé hash, HTML bloky alebo SQL výrazy). Je pozoruhodné, že medzi 24 úložiskami so skutočnými chybami boli také veľké projekty ako Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield a django-helpdesk. Problémy s čiarkami však nie sú špecifické pre Python a často sa objavujú v projektoch C/C++ (príklady nedávnych opráv sú LLVM, Mono, Tensorflow).

Hlavné typy študovaných chýb:

  • Náhodne chýba čiarka v zoznamoch, niciach a množinách, čo spôsobuje, že reťazce sa spájajú namiesto toho, aby boli interpretované ako samostatné hodnoty. Napríklad v Sentry jeden z testov vynechal čiarku medzi reťazcami „releases“ a „discover“ v zozname, čo viedlo ku kontrole neexistujúceho handlera „/releasesdiscover“ namiesto kontroly „/releases“ a „ /objaviť" samostatne.
    3.6 % testovaných repozitárov Pythonu malo chýbajúce chyby čiarkou

    Ďalším príkladom je, že chýbajúca čiarka v rapidpro spôsobila zlúčenie dvoch rôznych pravidiel na riadku 572:

    3.6 % testovaných repozitárov Pythonu malo chýbajúce chyby čiarkou

  • Chýbajúca čiarka na konci definície jednoprvkovej n-tice, čo spôsobuje, že priradenie priraďuje bežný typ namiesto n-tice. Napríklad výraz „hodnoty = (1,)“ bude mať za následok priradenie k premennej n-tice jedného prvku, ale výraz „hodnoty = (1)“ bude mať za následok priradenie typu celé číslo. Zátvorky v týchto priradeniach neovplyvňujú definíciu typu a sú voliteľné a prítomnosť n-tice určuje syntaktický analyzátor iba na základe prítomnosti čiarok. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # bude priradený reťazec namiesto n-tice. ) }
  • Opačnou situáciou sú čiarky navyše pri zadávaní. Ak sa na konci priradenia omylom ponechá čiarka, ako hodnota sa namiesto normálneho typu priradí n-tica (napríklad, ak je namiesto „hodnota = 1“ zadané „hodnota = 1“).

Zdroj: opennet.ru

Pridať komentár