W 3,6% testowanych repozytoriów Pythona zidentyfikowano błędy związane z pominiętymi przecinkami

Opublikowane wyniki badania podatności kodu w języku Python na błędy związane z nieprawidłowym użyciem przecinków w kodzie. Problemy te są spowodowane tym, że podczas wyliczeń Python automatycznie łączy ciągi w listach, jeśli nie są one oddzielone przecinkiem, oraz traktuje wartość jako krotkę, jeśli po wartości następuje przecinek. Po przeprowadzeniu zautomatyzowanej analizy 666 repozytoriów GitHub z kodem w języku Python, badacze zidentyfikowali możliwe problemy z przecinkami w 5% badanych projektów.

Dalsza ręczna weryfikacja pokazała, że rzeczywiste błędy występują tylko w 24 repozytoriach (3,6%), a pozostałe 1,4% to fałszywe alarmy (na przykład przecinek mógł być celowo pominięty między ciągami w celu połączenia rozdzielonych na kilka linii ścieżek plików, długich skrótów, bloków HTML lub wyrażeń SQL). Co ciekawe, wśród 24 repozytoriów z rzeczywistymi błędami znalazły się takie duże projekty jak Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield i django-helpdesk. Problemy z przecinkami nie są specyficzne dla Pythona i często pojawiają się w projektach w C/C++ (przykłady niedawnych poprawek — LLVM, Mono, Tensorflow).

Główne rodzaje badanych błędów:

  • Przypadkowo pominięty przecinek w listach, krotkach i zbiorach, prowadzący do łączenia ciągów zamiast interpretacji jako osobnych wartości. Na przykład w Sentry w jednym z testów pominięto przecinek między ciągami "releases" i "discover" w liście, co skutkowało sprawdzeniem nieistniejącego handlera "/releasesdiscover" zamiast oddzielnej weryfikacji "/releases" i "/discover".
    W 3,6% testowanych repozytoriów Pythona zidentyfikowano błędy związane z pominiętymi przecinkami

    Inny przykład — pominięty przecinek w rapidpro prowadził do połączenia dwóch różnych reguł w linii 572:

    W 3,6% testowanych repozytoriów Pythona zidentyfikowano błędy związane z pominiętymi przecinkami
  • Brakujące przecinek na końcu definicji krotki składającej się z jednego elementu, co sprawia, że podczas przypisania zostanie przypisany nie krotka, a zwykły typ. Na przykład, wyrażenie „values = (1,)” skutkuje przypisaniem zmiennej krotki składającej się z jednego elementu, ale „values = (1)” skutkuje przypisaniem typu całkowitego. Nawiasy w podanych przypisaniach nie wpływają na określenie typu i są opcjonalne, a istnienie krotki określane jest przez parsera tylko na podstawie obecności przecinków. REST_FRAMEWORK = { ‘DEFAULT_PERMISSION_CLASSES’: ( ‘rest_framework.permissions.IsAuthenticated’ # zamiast krotki przypisana zostanie ciąg. ) }
  • Sytuacja odwrotna — zbędne przecinki przy przypisaniu. Jeśli na końcu przypisania przypadkowo pozostawiono przecinek, to jako wartość zamiast zwykłego typu zostanie przypisana krotka (na przykład, jeśli zamiast „value = 1” wskazano „value = 1,”).

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster