3.6 % af de testede Python-lagre havde manglende kommafejl

Resultaterne af en undersøgelse af Python-kodens sårbarhed over for fejl relateret til forkert brug af kommaer i koden er blevet offentliggjort. Problemerne skyldes, at Python ved optælling automatisk sammenkæder strengene i listen, hvis de ikke er adskilt af et komma, og behandler også værdien som en tupel, hvis værdien efterfølges af et komma. Efter at have udført en automatiseret analyse af 666 GitHub-depoter med Python-kode, identificerede forskerne mulige kommaproblemer i 5 % af de undersøgte projekter.

Yderligere manuel inspektion viste, at reelle fejl kun var til stede i 24 arkiver (3.6 %), og de resterende 1.4 % var falske positiver (for eksempel kunne et komma bevidst udelades mellem linjer for at sammenkæde filstier med flere linjer, lange hashes, HTML blokke eller SQL-udtryk). Det er bemærkelsesværdigt, at blandt de 24 repositories med reelle fejl var så store projekter som Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield og django-helpdesk. Problemer med kommaer er dog ikke specifikke for Python og dukker ofte op i C/C++-projekter (eksempler på nylige rettelser er LLVM, Mono, Tensorflow).

De vigtigste fejltyper, der er undersøgt:

  • Ved et uheld mangler der et komma i lister, tupler og sæt, hvilket medfører, at strenge bliver sammenkædet i stedet for at blive fortolket som separate værdier. For eksempel i Sentry savnede en af ​​testene et komma mellem strengene "releases" og "discover" på listen, hvilket resulterede i at kontrollere en ikke-eksisterende "/releasesdiscover"-handler i stedet for at kontrollere "/releases" og " /opdag" separat.
    3.6 % af de testede Python-lagre havde manglende kommafejl

    Et andet eksempel er, at et manglende komma i rapidpro forårsagede, at to forskellige regler blev slået sammen på linje 572:

    3.6 % af de testede Python-lagre havde manglende kommafejl

  • Et manglende komma i slutningen af ​​en tupeldefinition med et enkelt element, hvilket får tildelingen til at tildele en almindelig type i stedet for en tupel. For eksempel vil udtrykket "værdier = (1,)" resultere i en tildeling til en variabel af en tupel af et element, men "værdier = (1)" vil resultere i en tildeling af en heltalstype. Parenteserne i ovenstående opgaver påvirker ikke typedefinitionen og er valgfri, og tilstedeværelsen af ​​en tupel bestemmes kun af parseren ud fra tilstedeværelsen af ​​kommaer. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # vil blive tildelt en streng i stedet for en tupel. ) }
  • Den modsatte situation er ekstra kommaer under opgaven. Hvis et komma ved et uheld efterlades i slutningen af ​​en opgave, vil en tuple blive tildelt som værdien i stedet for den normale type (f.eks. hvis "værdi = 1," er angivet i stedet for "værdi = 1").

Kilde: opennet.ru

Tilføj en kommentar