Megjelent egy tanulmány eredményei, amely a Python kód vesszőhibákkal szembeni sebezhetőségét vizsgálta. A problémák abból a tényből fakadnak, hogy a Python automatikusan összefűzi a karakterláncokat egy listában, ha a felsorolások nincsenek vesszővel elválasztva, és az értékeket tuple-ként kezeli, ha vessző követi őket. Miután automatizált elemzést végeztek 666 Python kódot tartalmazó GitHub-repozitóriumon, a kutatók a vizsgált projektek 5%-ában azonosítottak potenciális vesszőproblémákat.
További manuális ellenőrzések során kiderült, hogy mindössze 24 adattár (3.6%) tartalmazott valódi hibákat, míg a fennmaradó 1.4% téves pozitív volt (például szándékosan kihagyhattak egy vesszőt a sorok között a fájlútvonalak, hosszú hashek, HTML blokkok vagy SQL utasítások összefűzéséhez). Figyelemre méltó, hogy a valódi hibákat tartalmazó 24 adattár olyan nagyobb projekteket is tartalmazott, mint a Tensorflow, a Google V8, a Sentry, a Pydata xarray, a rapidpro, a django-colorfield és a django-helpdesk. A vesszőproblémák azonban nem kifejezetten a Pythonra jellemzőek, és gyakran előfordulnak a C/C++ projektekben (a legutóbbi javítások közé tartozik az LLVM, a Mono és a Tensorflow).
A vizsgált főbb hibatípusok:
- Egy véletlenül hiányzó vessző listákban, tuple-ökben és halmazokban a karakterláncok összefűzését okozza a különálló értékként való értelmezés helyett. Például a Sentryben az egyik tesztesetben hiányzott egy vessző a "releases" és a "discover" karakterláncok között egy listában, ami egy nem létező "/releasesdiscover" kezelő kereséséhez vezetett a "/releases" és a "/discover" külön ellenőrzése helyett.

Egy másik példa a rapidpro-ban hiányzó vessző, ami két különböző szabály 572. sorban történő egyesítéséhez vezetett:

- Egyetlen tuple-definíció végén lévő vessző hiánya a tuple helyett egy normál típushoz való hozzárendelést eredményezi. Például a "values = (1,)" egyetlen tuple-t rendelne egy változóhoz, de a "values = (1)" egy egész típusú értéket rendelne hozzá. Az ezekben az értékadásokban szereplő zárójelek nem befolyásolják a típusdefiníciót, és opcionálisak, a tuple jelenlétét pedig 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 kerül hozzárendelésre tuple helyett. ) }
- Az értékadás során a plusz vesszők fordított helyzetben vannak. Ha véletlenül vessző marad az értékadás végén, akkor egy tuple lesz értékként rendelve a szokásos típus helyett (például, ha az "érték = 1" értéke "érték = 1,"-ként van megadva).
Forrás: opennet.ru


