3.6% van Python-bewaarplekke wat getoets is, het ontbrekende kommafoute gehad

Die resultate van 'n studie oor die kwesbaarheid van Python-kode vir foute wat verband hou met die verkeerde gebruik van kommas in die kode is gepubliseer. Die probleme word veroorsaak deur die feit dat Python outomaties die stringe in die lys aaneenskakel wanneer hulle nie deur 'n komma geskei word nie, en ook die waarde as 'n tupel hanteer as die waarde deur 'n komma gevolg word. Nadat die navorsers 'n outomatiese ontleding van 666 GitHub-bewaarplekke met Python-kode uitgevoer het, het die navorsers moontlike kommakwessies in 5% van die projekte wat bestudeer is, geïdentifiseer.

Verdere handmatige inspeksie het getoon dat werklike foute in slegs 24 bewaarplekke (3.6%) teenwoordig was, en die oorblywende 1.4% was vals positiewe (byvoorbeeld, 'n komma kon doelbewus weggelaat word tussen reëls om multi-lyn lêerpaaie, lang hashes, HTML aaneen te voeg. blokke of SQL-uitdrukkings). Dit is opmerklik dat onder die 24 bewaarplekke met werklike foute sulke groot projekte soos Tensorflow, Google V8, Sentry, Pydata xarray, rapidpro, django-colorfield en django-helpdesk was. Probleme met kommas is egter nie spesifiek vir Python nie en kom dikwels voor in C/C++-projekte (voorbeelde van onlangse regstellings is LLVM, Mono, Tensorflow).

Die hooftipes foute wat bestudeer is:

  • Ontbreek per ongeluk 'n komma in lyste, tupels en stelle, wat veroorsaak dat stringe aaneengeskakel word in plaas daarvan om as aparte waardes geïnterpreteer te word. Byvoorbeeld, in Sentry het een van die toetse 'n komma tussen die stringe "releases" en "discover" in die lys gemis, wat daartoe gelei het dat 'n nie-bestaande "/releasesdiscover"-hanteerder gekontroleer is, in plaas van om "/releases" en " /discover" afsonderlik.
    3.6% van Python-bewaarplekke wat getoets is, het ontbrekende kommafoute gehad

    Nog 'n voorbeeld is dat 'n ontbrekende komma in rapidpro veroorsaak het dat twee verskillende reëls op reël 572 saamgevoeg is:

    3.6% van Python-bewaarplekke wat getoets is, het ontbrekende kommafoute gehad

  • 'n Ontbrekende komma aan die einde van 'n enkelelement-tupeldefinisie, wat veroorsaak dat die opdrag 'n gewone tipe eerder as 'n tupel toeken. Byvoorbeeld, die uitdrukking "waardes = (1,)" sal lei tot 'n toewysing aan 'n veranderlike van 'n tupel van een element, maar "waardes = (1)" sal lei tot 'n toewysing van 'n heelgetal tipe. Die hakies in hierdie opdragte beïnvloed nie die tipe definisie nie en is opsioneel, en die teenwoordigheid van 'n tupel word slegs deur die ontleder bepaal op grond van die teenwoordigheid van kommas. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' # sal 'n string in plaas van 'n tupel toegeken word. ) }
  • Die teenoorgestelde situasie is ekstra kommas tydens opdrag. As 'n komma per ongeluk aan die einde van 'n opdrag gelaat word, sal 'n tupel as die waarde in plaas van die gewone tipe toegeken word (byvoorbeeld, as "waarde = 1," word gespesifiseer in plaas van "waarde = 1").

Bron: opennet.ru

Voeg 'n opmerking