Roedd gan 3.6% o ystorfeydd Python a brofwyd wallau coma coll

Mae canlyniadau astudiaeth ar ba mor agored i niwed yw cod Python i wallau sy'n ymwneud â'r defnydd anghywir o atalnodau yn y cod wedi'u cyhoeddi. Mae'r problemau'n cael eu hachosi gan y ffaith bod Python, wrth rifo, yn cydgadwynu'r llinynnau yn y rhestr yn awtomatig os nad ydyn nhw'n cael eu gwahanu gan goma, a hefyd yn trin y gwerth fel tuple os yw'r gwerth yn cael ei ddilyn gan goma. Ar ôl cynnal dadansoddiad awtomataidd o 666 o gadwrfeydd GitHub gyda chod Python, nododd yr ymchwilwyr faterion coma posibl mewn 5% o'r prosiectau a astudiwyd.

Dangosodd archwiliad pellach â llaw mai dim ond mewn 24 ystorfa (3.6%) yr oedd gwallau gwirioneddol yn bresennol, ac roedd yr 1.4% a oedd yn weddill yn gadarnhaol ffug (er enghraifft, gellid hepgor coma yn fwriadol rhwng llinellau i gydgadwynu llwybrau ffeil aml-linell, hashes hir, HTML blociau neu ymadroddion SQL). Mae'n werth nodi bod prosiectau mor fawr â Tensorflow, Google V24, Sentry, Pydata xarray, rapidpro, django-colorfield a django-helpdesk ymhlith y 8 ystorfa â gwallau gwirioneddol. Fodd bynnag, nid yw problemau gydag atalnodau yn benodol i Python ac yn aml yn codi mewn prosiectau C/C++ (enghreifftiau o atebion diweddar yw LLVM, Mono, Tensorflow).

Y prif fathau o wallau a astudiwyd:

  • Colli coma yn ddamweiniol mewn rhestrau, tuples, a setiau, gan achosi llinynnau i gael eu concatenated yn hytrach na chael eu dehongli fel gwerthoedd ar wahân. Er enghraifft, yn Sentry, methodd un o'r profion atalnod rhwng y llinynnau "rhyddhau" a "darganfod" yn y rhestr, a arweiniodd at wirio triniwr "/releasesdiscover" nad oedd yn bodoli, yn lle gwirio "/rhyddhau" a " /darganfod" ar wahân.
    Roedd gan 3.6% o ystorfeydd Python a brofwyd wallau coma coll

    Enghraifft arall yw bod coma coll yn rapidpro wedi achosi i ddwy reol wahanol gael eu huno ar linell 572:

    Roedd gan 3.6% o ystorfeydd Python a brofwyd wallau coma coll

  • Coma coll ar ddiwedd diffiniad tuple un elfen, sy'n achosi'r aseiniad i aseinio math rheolaidd yn hytrach na thuple. Er enghraifft, bydd yr ymadrodd "values ​​= (1,)" yn arwain at aseiniad i newidyn tuple o un elfen, ond bydd "values ​​= (1)" yn arwain at aseiniad o fath cyfanrif. Nid yw'r cromfachau yn yr aseiniadau hyn yn effeithio ar ddiffiniad y math ac maent yn ddewisol, a dim ond ar sail presenoldeb coma y mae presenoldeb tuple yn cael ei bennu gan y parser. REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated' bydd # yn cael llinyn yn lle tuple. ) }
  • Y sefyllfa arall yw atalnodau ychwanegol yn ystod aseiniad. Os gadewir coma yn ddamweiniol ar ddiwedd aseiniad, bydd tuple yn cael ei neilltuo fel y gwerth yn lle'r math arferol (er enghraifft, os nodir “gwerth = 1,” yn lle “gwerth = 1”).

Ffynhonnell: opennet.ru

Ychwanegu sylw