I 3,6% av de testade Python-repositorierna upptÀcktes fel relaterade till saknade kommatecken

Resultaten av en studie om sÄrbarheten i Python-kod för fel relaterade till felaktig anvÀndning av kommatecken har publicerats. Problemen beror pÄ att Python automatiskt sammanfogar strÀngar i en lista om de inte separeras med ett kommatecken, samt behandlar vÀrdet som en tuple om ett kommatecken följer efter vÀrdet. Genom att genomföra en automatiserad analys av 666 GitHub-repositorier med Python-kod, identifierade forskarna potentiella problem med kommatecken i 5% av de granskade projekten.

Vid en efterföljande manuell granskning visade det sig att verkliga fel endast fanns i 24 repositorier (3,6%), medan de övriga 1,4% var falska positive (t.ex. ett kommatecken kan ha uteslutits avsiktligt mellan strĂ€ngar för att sammanfoga uppdelade filvĂ€gar, lĂ„nga hashvĂ€rden, HTML-block eller SQL-uttryck). AnmĂ€rkningsvĂ€rt Ă€r att bland de 24 repositorier med verkliga fel finns stora projekt som Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield och django-helpdesk. Problemen med kommatecken Ă€r inte specifika för Python och dyker ofta upp i projekt pĂ„ C/C++ (exempel pĂ„ nyligen gjorda korrigeringar — LLVM, Mono, Tensorflow).

De huvudsakliga typerna av studerade fel:

  • Oavsiktligt saknat kommatecken i listor, tuples och mĂ€ngder, vilket leder till att strĂ€ngar sammanfogas istĂ€llet för att tolkas som separata vĂ€rden. Till exempel, i Sentry, i ett av testerna, saknades ett kommatecken mellan strĂ€ngarna "releases" och "discover" i listan, vilket ledde till att en icke-existerande hanterare "\/releasesdiscover" kontrollerades istĂ€llet för en separat kontroll av "\/releases" och "\/discover".
    I 3,6% av de testade Python-repositorierna upptÀcktes fel relaterade till saknade kommatecken

    Ett annat exempel — ett saknat kommatecken i rapidpro ledde till att tvĂ„ olika regler sammanfogades i rad 572:

    I 3,6% av de testade Python-repositorierna upptÀcktes fel relaterade till saknade kommatecken
  • Ett saknat komma i slutet av definitionen av en enstaka tuppel, vilket leder till att en vanlig typ tilldelas istĂ€llet för en tuppel. Till exempel, uttrycket "values = (1,)" ger tilldelning av en enstaka tuppel, men "values = (1)" leder till tilldelning av en heltalstyp. Parenteserna i de angivna tilldelningarna pĂ„verkar inte typdefinitionen och Ă€r valfria, medan förekomsten av en tuppel endast bestĂ€ms av parsern baserat pĂ„ förekomsten av kommatecken. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # istĂ€llet för en tuppel kommer en strĂ€ng att tilldelas. ) }
  • Den omvĂ€nda situationen — överflödiga kommatecken vid tilldelning. Om ett komma av misstag har lĂ€mnats kvar i slutet av tilldelningen, sĂ„ kommer en tuppel att tilldelas som vĂ€rde istĂ€llet för en vanlig typ (till exempel, om "value = 1" anges som "value = 1,").

KĂ€lla: opennet.ru

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster