3.6% van de geteste Python-opslagplaatsen vertoonde ontbrekende kommafouten

De resultaten van een onderzoek naar de kwetsbaarheid van Python-code voor fouten die verband houden met het onjuiste gebruik van komma's in de code zijn gepubliceerd. De problemen worden veroorzaakt door het feit dat Python bij het opsommen automatisch de strings in de lijst samenvoegt als ze niet door een komma worden gescheiden, en de waarde ook als een tupel behandelt als de waarde wordt gevolgd door een komma. Na het uitvoeren van een geautomatiseerde analyse van 666 GitHub-repository's met Python-code, identificeerden de onderzoekers mogelijke kommaproblemen in 5% van de bestudeerde projecten.

Verdere handmatige inspectie toonde aan dat slechts in 24 repository's (3.6%) echte fouten aanwezig waren, en dat de resterende 1.4% valse positieven waren (een komma kon bijvoorbeeld opzettelijk worden weggelaten tussen regels om bestandspaden van meerdere regels, lange hashes, HTML-codes aan elkaar te koppelen). blokken of SQL-expressies). Het is opmerkelijk dat onder de 24 repositories met echte fouten zulke grote projecten waren als Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield en django-helpdesk. Problemen met komma's zijn echter niet specifiek voor Python en duiken vaak op in C/C++-projecten (voorbeelden van recente oplossingen zijn LLVM, Mono, Tensorflow).

De belangrijkste soorten fouten die zijn bestudeerd:

  • Per ongeluk ontbreken van een komma in lijsten, tupels en sets, waardoor tekenreeksen worden samengevoegd in plaats van te worden geïnterpreteerd als afzonderlijke waarden. In Sentry miste een van de tests bijvoorbeeld een komma tussen de tekenreeksen "releases" en "discover" in de lijst, wat resulteerde in het controleren van een niet-bestaande handler "/releasesdiscover", in plaats van het controleren van "/releases" en " /ontdek" afzonderlijk.
    3.6% van de geteste Python-opslagplaatsen vertoonde ontbrekende kommafouten

    Een ander voorbeeld is dat een ontbrekende komma in rapidpro ervoor zorgde dat twee verschillende regels op regel 572 werden samengevoegd:

    3.6% van de geteste Python-opslagplaatsen vertoonde ontbrekende kommafouten

  • Een ontbrekende komma aan het einde van een tupeldefinitie met één element, waardoor de toewijzing een regulier type toewijst in plaats van een tupel. De uitdrukking "waarden = (1,)" zal bijvoorbeeld resulteren in een toewijzing aan een variabele van een tupel van één element, maar "waarden = (1)" zal resulteren in een toewijzing van een geheel getaltype. De haakjes in deze toewijzingen hebben geen invloed op de typedefinitie en zijn optioneel, en de aanwezigheid van een tuple wordt alleen door de parser bepaald op basis van de aanwezigheid van komma's. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated' # krijgt een string toegewezen in plaats van een tupel. ) }
  • De tegenovergestelde situatie is extra komma's tijdens de opdracht. Als er per ongeluk een komma achterblijft aan het einde van een toewijzing, wordt een tupel toegewezen als waarde in plaats van het gebruikelijke type (als bijvoorbeeld 'waarde = 1' wordt opgegeven in plaats van 'waarde = 1').

Bron: opennet.ru

Voeg een reactie