3.6 % av Python-repositoriene som ble testet hadde manglende kommafeil

Resultatene av en studie om sårbarheten til Python-kode for feil knyttet til feil bruk av kommaer i koden er publisert. Problemene er forårsaket av at Python automatisk setter sammen strengene i listen ved oppregning hvis de ikke er atskilt med komma, og behandler også verdien som en tuppel hvis verdien etterfølges av et komma. Etter å ha utført en automatisert analyse av 666 GitHub-depoter med Python-kode, identifiserte forskerne mulige kommaproblemer i 5 % av prosjektene som ble studert.

Ytterligere manuell inspeksjon viste at reelle feil var til stede i bare 24 depoter (3.6 %), og de resterende 1.4 % var falske positiver (for eksempel kunne et komma bevisst utelates mellom linjene for å sette sammen flerlinjers filstier, lange hashes, HTML blokker eller SQL-uttrykk). Det er bemerkelsesverdig at blant de 24 repositoriene med reelle feil var så store prosjekter som Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield og django-helpdesk. Problemer med komma er imidlertid ikke spesifikke for Python og dukker ofte opp i C/C++-prosjekter (eksempler på nyere rettelser er LLVM, Mono, Tensorflow).

De viktigste typene feil som er studert:

  • Mangler ved et uhell et komma i lister, tupler og sett, noe som fører til at strenger blir sammenkoblet i stedet for å bli tolket som separate verdier. For eksempel, i Sentry, savnet en av testene et komma mellom strengene "releases" og "discover" i listen, noe som resulterte i å sjekke en ikke-eksisterende "/releasesdiscover"-behandler, i stedet for å sjekke "/releases" og " /discover" separat.
    3.6 % av Python-repositoriene som ble testet hadde manglende kommafeil

    Et annet eksempel er at et manglende komma i rapidpro førte til at to forskjellige regler ble slått sammen på linje 572:

    3.6 % av Python-repositoriene som ble testet hadde manglende kommafeil

  • Et manglende komma på slutten av en enkeltelement-tuppeldefinisjon, noe som gjør at oppgaven tilordner en vanlig type i stedet for en tuppel. For eksempel vil uttrykket "verdier= (1,)" resultere i en tilordning til en variabel av en tuppel av ett element, men "verdier = (1)" vil resultere i en tilordning av en heltallstype. Parentesene i disse oppgavene påvirker ikke typedefinisjonen og er valgfrie, og tilstedeværelsen av en tuppel bestemmes av parseren kun basert på tilstedeværelsen av kommaer. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # vil bli tildelt en streng i stedet for en tuppel. ) }
  • Den motsatte situasjonen er ekstra kommaer under oppdrag. Hvis et komma ved et uhell settes igjen på slutten av en oppgave, vil en tuppel bli tildelt som verdien i stedet for den vanlige typen (for eksempel hvis "verdi = 1," er spesifisert i stedet for "verdi = 1").

Kilde: opennet.ru

Legg til en kommentar