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".

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

- 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


