A tesztelt Python-tárolók 3.6%-a tartalmazott hiányzó vesszőhibákat

Megjelent a Python kódnak a kódban előforduló helytelen vesszőhasználattal kapcsolatos hibákkal kapcsolatos sebezhetőségéről szóló tanulmány eredményei. A problémákat az okozza, hogy felsoroláskor a Python automatikusan összefűzi a listában szereplő karakterláncokat, ha nincsenek vesszővel elválasztva, illetve sorszámként kezeli az értéket, ha az értéket vessző követi. 666 Python-kóddal ellátott GitHub-tároló automatizált elemzését követően a kutatók a vizsgált projektek 5%-ában azonosították a lehetséges vesszőhibákat.

A további kézi ellenőrzés azt mutatta, hogy valódi hibák csak 24 adattárban (3.6%) voltak, a fennmaradó 1.4% pedig hamis pozitív volt (például szándékosan elhagyható a vessző a sorok között többsoros fájlútvonalak, hosszú hash-ek, HTML összefűzéséhez blokkok vagy SQL kifejezések). Figyelemre méltó, hogy a 24 valódi hibákat tartalmazó adattár között olyan nagy projektek voltak, mint a Tensorflow, a Google V8, a Sentry, a Pydata xarray, a rapidpro, a django-colorfield és a django-helpdesk. A vesszővel kapcsolatos problémák azonban nem a Pythonra jellemzőek, és gyakran előfordulnak C/C++ projektekben (a legutóbbi javítások példái az LLVM, Mono, Tensorflow).

A vizsgált fő hibatípusok:

  • Véletlenül hiányzik a vessző a listákból, sorokból és halmazokból, ami miatt a karakterláncok összefűződnek, ahelyett, hogy külön értékként értelmeznék őket. Például a Sentry-ben az egyik tesztből hiányzott egy vessző a "releases" és a "discover" karakterláncok között a listában, ami egy nem létező "/releasesdiscover" kezelő ellenőrzését eredményezte a "/releases" és "/releases" ellenőrzése helyett. /discover" külön.
    A tesztelt Python-tárolók 3.6%-a tartalmazott hiányzó vesszőhibákat

    Egy másik példa, hogy egy hiányzó vessző a rapidpro programban két különböző szabály összevonását okozta az 572. sorban:

    A tesztelt Python-tárolók 3.6%-a tartalmazott hiányzó vesszőhibákat

  • Hiányzó vessző az egyelemes sordefiníció végén, ami azt okozza, hogy a hozzárendelés rendes típust rendel hozzá, nem pedig sorhoz. Például az "értékek = (1,)" kifejezés egy elemből álló sor változójához, az "értékek = (1)" pedig egész típusú hozzárendelést eredményez. A zárójelek ezekben a hozzárendelésekben nem befolyásolják a típusdefiníciót, és nem kötelezőek, és a sor jelenlétét az elemző csak a vesszők jelenléte alapján határozza meg. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated' # egy karakterlánc lesz hozzárendelve sor helyett. ) }
  • Az ellenkező helyzet az extra vessző a hozzárendelés során. Ha véletlenül vesszőt hagyunk egy hozzárendelés végén, akkor a szokásos típus helyett egy sor lesz hozzárendelve értékként (ha például az „érték = 1” van megadva az „érték = 1” helyett).

Forrás: opennet.ru

Hozzászólás