3.6 % av testade Python-förråd saknade kommafel

Resultaten av en studie om Python-kodens sårbarhet för fel relaterade till felaktig användning av kommatecken i koden har publicerats. Problemen orsakas av att Python vid uppräkning automatiskt sammanfogar strängarna i listan om de inte är åtskilda med kommatecken, och behandlar även värdet som en tupel om värdet följs av ett kommatecken. Efter att ha genomfört en automatiserad analys av 666 GitHub-förråd med Python-kod, identifierade forskarna möjliga kommaproblem i 5 % av de studerade projekten.

Ytterligare manuell inspektion visade att verkliga fel fanns i endast 24 arkiv (3.6 %), och de återstående 1.4 % var falska positiva (till exempel kunde ett kommatecken avsiktligt utelämnas mellan raderna för att sammanfoga flerradiga filsökvägar, långa hash, HTML block eller SQL-uttryck). Det är anmärkningsvärt att bland de 24 arkiven med verkliga fel fanns så stora projekt som Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield och django-helpdesk. Problem med kommatecken är dock inte specifika för Python och dyker ofta upp i C/C++-projekt (exempel på senaste korrigeringar är LLVM, Mono, Tensorflow).

De huvudsakliga typerna av fel som studeras:

  • Av misstag saknar ett kommatecken i listor, tupler och uppsättningar, vilket gör att strängar sammanlänkas istället för att tolkas som separata värden. Till exempel, i Sentry, missade ett av testerna ett kommatecken mellan strängarna "releases" och "discover" i listan, vilket resulterade i att man kontrollerade en icke-existerande "/releasesdiscover"-hanterare istället för att kontrollera "/releases" och " /discover" separat.
    3.6 % av testade Python-förråd saknade kommafel

    Ett annat exempel är att ett saknat kommatecken i rapidpro gjorde att två olika regler slogs samman på rad 572:

    3.6 % av testade Python-förråd saknade kommafel

  • Ett kommatecken som saknas i slutet av en tupeldefinition med ett element, vilket gör att tilldelningen tilldelar en vanlig typ snarare än en tupel. Till exempel kommer uttrycket "värden = (1,)" att resultera i en tilldelning till en variabel av en tuppel av ett element, men "värden = (1)" kommer att resultera i en tilldelning av en heltalstyp. Parenteserna i dessa tilldelningar påverkar inte typdefinitionen och är valfria, och närvaron av en tupel bestäms av tolken endast baserat på närvaron av kommatecken. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # kommer att tilldelas en sträng istället för en tuppel. ) }
  • Den motsatta situationen är extra kommatecken under uppdraget. Om ett kommatecken av misstag lämnas i slutet av en uppgift kommer en tupel att tilldelas som värdet istället för den vanliga typen (till exempel om "värde = 1" anges istället för "värde = 1").

Källa: opennet.ru

Lägg en kommentar