Sut i weithredu dadansoddwr cod statig mewn prosiect etifeddiaeth heb ddigalonni'r tîm

Sut i weithredu dadansoddwr cod statig mewn prosiect etifeddiaeth heb ddigalonni'r tîm
Mae'n hawdd rhoi cynnig ar ddadansoddwr cod statig. Ond i'w weithredu, yn enwedig yn natblygiad hen brosiect mawr, mae angen sgil. Os caiff ei wneud yn anghywir, gall y dadansoddwr ychwanegu gwaith, arafu datblygiad, a digalonni'r tîm. Gadewch i ni siarad yn fyr am sut i fynd ati'n iawn i integreiddio dadansoddiad statig i'r broses ddatblygu a dechrau ei ddefnyddio fel rhan o CI/CD.

Cyflwyniad

Yn ddiweddar tynnwyd fy sylw at y cyhoeddiad "Dechrau Arni Gyda Dadansoddiad Statig Heb Lethu'r Tîm". Ar y naill law, mae hon yn erthygl dda sy'n werth dod yn gyfarwydd â hi. Ar y llaw arall, mae'n ymddangos i mi nad yw'n dal i ddarparu ateb cyflawn ar sut i weithredu dadansoddiad statig yn ddi-boen mewn prosiect gyda llawer Mae'r erthygl yn dweud y Gallwch dderbyn dyled dechnegol a gweithio ar god newydd yn unig, ond nid oes ateb i beth i'w wneud â'r ddyled dechnegol hon yn ddiweddarach.

Mae ein tîm PVS-Studio yn cynnig ei farn ar y pwnc hwn. Gadewch i ni edrych ar sut mae'r broblem o weithredu dadansoddwr cod statig yn codi yn y lle cyntaf, sut i oresgyn y broblem hon, a sut i ddileu dyled dechnegol yn ddi-boen yn raddol.

Materion

Fel arfer nid yw'n anodd lansio a gweld sut mae dadansoddwr statig yn gweithio [1]. Efallai y byddwch yn gweld gwallau diddorol neu hyd yn oed gwendidau brawychus posibl yn y cod. Gallwch chi hyd yn oed drwsio rhywbeth, ond yna mae llawer o raglenwyr yn rhoi'r gorau iddi.

Mae pob dadansoddwr statig yn cynhyrchu positifau ffug. Mae hyn yn nodwedd o'r fethodoleg dadansoddi cod statig, ac ni ellir gwneud dim yn ei gylch. Yn yr achos cyffredinol, mae hon yn broblem na ellir ei datrys, fel y cadarnhawyd gan theorem Rice [2]. Ni fydd algorithmau dysgu peirianyddol yn helpu chwaith [3]. Hyd yn oed os na all person bob amser ddweud a yw hyn neu'r cod hwnnw'n anghywir, yna ni ddylech ddisgwyl hyn gan y rhaglen :).

Nid yw positifau ffug yn broblem os yw'r dadansoddwr statig eisoes wedi'i ffurfweddu:

  • Setiau rheolau amherthnasol i bobl anabl;
  • Mae rhai diagnosteg amherthnasol wedi'u hanalluogi;
  • Os ydym yn sôn am C neu C++, yna mae macros yn cael eu marcio sy'n cynnwys lluniadau penodol sy'n achosi i rybuddion diwerth ymddangos ym mhob man lle defnyddir macros o'r fath;
  • Mae swyddogaethau ei hun wedi'u marcio sy'n perfformio gweithredoedd tebyg i swyddogaethau system (ei analog ei hun cofiadwy neu printf) [4];
  • Mae positifau ffug yn cael eu hanalluogi'n benodol gan ddefnyddio sylwadau;
  • Ac yn y blaen.

Yn yr achos hwn, gallwn ddisgwyl cyfradd bositif ffug isel o tua 10-15% [5]. Mewn geiriau eraill, bydd 9 o bob 10 rhybudd dadansoddwr yn nodi problem wirioneddol yn y cod, neu o leiaf “cod sy'n arogli'n gryf.” Cytunwch, mae'r senario hon yn hynod ddymunol, ac mae'r dadansoddwr yn ffrind go iawn i'r rhaglennydd.

Sut i weithredu dadansoddwr cod statig mewn prosiect etifeddiaeth heb ddigalonni'r tîm
Mewn gwirionedd, mewn prosiect mawr, bydd y darlun cychwynnol yn hollol wahanol. Mae'r dadansoddwr yn cyhoeddi cannoedd neu filoedd o rybuddion ar gyfer cod etifeddiaeth. Mae'n amhosibl deall yn gyflym pa rai o'r rhybuddion hyn sy'n berthnasol a pha rai nad ydynt. Mae'n afresymol eistedd i lawr a dechrau delio â'r holl rybuddion hyn, gan y bydd y prif waith yn yr achos hwn yn dod i ben am ddyddiau neu wythnosau. Yn nodweddiadol, ni all tîm fforddio sefyllfa o'r fath. Bydd hefyd nifer enfawr o diffs sy'n difetha'r hanes newid. Ac mae'n anochel y bydd golygu llawer o ddarnau yn y cod yn gyflym yn arwain at deipos a gwallau newydd.

Ac yn bwysicaf oll, nid yw camp o'r fath yn y frwydr yn erbyn rhybuddion yn gwneud fawr o synnwyr. Cytuno, ers i'r prosiect fod yn rhedeg yn llwyddiannus ers blynyddoedd lawer, fod y rhan fwyaf o'r gwallau critigol ynddo eisoes wedi'u cywiro. Oedd, roedd yr atgyweiriadau hyn yn ddrud iawn, bu'n rhaid eu dadfygio, cawsant adborth negyddol gan ddefnyddwyr am fygiau, ac ati. Byddai dadansoddwr statig yn helpu i drwsio llawer o'r gwallau hyn ar y cam codio, yn gyflym ac yn rhad. Ond ar hyn o bryd, un ffordd neu'r llall, mae'r gwallau hyn wedi'u trwsio, ac mae'r dadansoddwr yn bennaf yn canfod gwallau nad ydynt yn hanfodol yn yr hen god. Efallai na fydd y cod hwn yn cael ei ddefnyddio, yn anaml iawn y caiff ei ddefnyddio, ac efallai na fydd gwall ynddo yn arwain at ganlyniadau amlwg. Efallai mai rhywle lle mae'r cysgod o'r botwm yw'r lliw anghywir, ond nid yw hyn yn ymyrryd â defnydd unrhyw un o'r cynnyrch.

Wrth gwrs, mae hyd yn oed mân gamgymeriadau yn dal i fod yn gamgymeriadau. Ac weithiau gall camgymeriad guddio bregusrwydd gwirioneddol. Fodd bynnag, mae rhoi'r gorau i bopeth a threulio diwrnodau / wythnosau yn delio â diffygion sydd prin yn amlygu eu hunain yn edrych fel syniad amheus.

Mae rhaglenwyr yn edrych, yn edrych, yn edrych ar yr holl rybuddion hyn am yr hen god gweithio ... Ac maen nhw'n meddwl: gallwn ni wneud heb ddadansoddiad statig. Gadewch i ni fynd i ysgrifennu rhai swyddogaethau defnyddiol newydd.

Yn eu ffordd eu hunain, maen nhw'n iawn. Maent yn meddwl bod yn rhaid iddynt rywsut gael gwared ar yr holl rybuddion hyn yn gyntaf. Dim ond wedyn y byddant yn gallu elwa o ddefnydd rheolaidd o'r dadansoddwr cod. Fel arall, bydd rhybuddion newydd yn boddi mewn hen rai, ac ni fydd neb yn talu sylw iddynt.

Dyma'r un gyfatebiaeth â rhybuddion casglwr. Nid heb reswm y maent yn argymell cadw nifer y rhybuddion casglwr yn 0. Os oes 1000 o rybuddion, yna pan fydd 1001, ni fydd neb yn talu sylw iddo, ac nid yw'n glir ble i edrych am y rhybudd mwyaf newydd hwn.

Sut i weithredu dadansoddwr cod statig mewn prosiect etifeddiaeth heb ddigalonni'r tîm
Y peth gwaethaf yn y stori hon yw os bydd rhywun oddi uchod ar hyn o bryd yn eich gorfodi i ddefnyddio dadansoddiad cod statig. Ni fydd hyn ond yn digalonni'r tîm, oherwydd o'u safbwynt nhw bydd cymhlethdod biwrocrataidd ychwanegol a fydd yn rhwystro. Ni fydd neb yn edrych ar adroddiadau’r dadansoddwr, a dim ond “ar bapur” y bydd pob defnydd ohonynt. Y rhai. Yn ffurfiol, mae dadansoddiad wedi'i ymgorffori ym mhroses DevOps, ond yn ymarferol nid yw hyn o fudd i unrhyw un. Clywsom straeon manwl mewn bythau gan fynychwyr y gynhadledd. Gall profiad o'r fath atal rhaglenwyr rhag defnyddio offer dadansoddi statig am amser hir, os nad am byth.

Gweithredu a dileu dyled dechnegol

Mewn gwirionedd, nid oes dim byd anodd neu frawychus ynghylch cyflwyno dadansoddiad statig hyd yn oed i hen brosiect mawr.

CI / CD

Ar ben hynny, gellir gwneud y dadansoddwr ar unwaith yn rhan o'r broses datblygu parhaus. Er enghraifft, mae dosbarthiad PVS-Studio yn cynnwys cyfleustodau ar gyfer gweld yr adroddiad yn gyfleus yn y fformat sydd ei angen arnoch, a hysbysiadau i ddatblygwyr a ysgrifennodd adrannau problemus o'r cod. I'r rhai sydd â mwy o ddiddordeb mewn lansio PVS-Studio o systemau CI / CD, argymhellaf eich bod yn ymgyfarwyddo â'r rhai cyfatebol. adran dogfennaeth a chyfres o erthyglau:

Ond gadewch inni ddychwelyd at y mater o nifer fawr o bethau cadarnhaol ffug yn ystod camau cyntaf gweithredu offer dadansoddi cod.

Trwsio dyled dechnegol bresennol a delio â rhybuddion newydd

Mae dadansoddwyr statig masnachol modern yn caniatáu ichi astudio rhybuddion newydd sy'n ymddangos mewn cod newydd neu wedi'i newid yn unig. Mae gweithrediad y mecanwaith hwn yn amrywio, ond mae'r hanfod yr un peth. Yn y dadansoddwr statig PVS-Studio, gweithredir y swyddogaeth hon fel a ganlyn.

I ddechrau defnyddio dadansoddiad statig yn gyflym, rydym yn awgrymu bod defnyddwyr PVS-Studio yn defnyddio'r mecanwaith ar gyfer atal rhybuddion ar raddfa fawr [6]. Y syniad cyffredinol yw'r canlynol. Lansiodd y defnyddiwr y dadansoddwr a derbyniodd lawer o rybuddion. Gan fod prosiect sydd wedi bod yn cael ei ddatblygu ers blynyddoedd lawer yn fyw, yn datblygu ac yn gwneud arian, yna yn fwyaf tebygol ni fydd llawer o rybuddion yn yr adroddiad yn nodi diffygion critigol. Mewn geiriau eraill, mae bygiau critigol eisoes wedi'u trwsio un ffordd neu'r llall gan ddefnyddio dulliau drutach neu diolch i adborth gan gwsmeriaid. Yn unol â hynny, gellir ystyried popeth y mae'r dadansoddwr yn ei ddarganfod ar hyn o bryd yn ddyled dechnegol, sy'n anymarferol ceisio dileu ar unwaith.

Gallwch ddweud wrth PVS-Studio i ystyried y rhybuddion hyn yn amherthnasol am y tro (arbed dyled dechnegol yn ddiweddarach), ac ni fydd yn eu dangos mwyach. Mae'r dadansoddwr yn creu ffeil arbennig lle mae'n arbed gwybodaeth am wallau nad ydynt yn ddiddorol eto. Ac yn awr bydd PVS-Studio yn cyhoeddi rhybuddion ar gyfer cod newydd neu god wedi'i newid yn unig. Ar ben hynny, mae hyn i gyd yn cael ei weithredu'n glyfar. Os, er enghraifft, ychwanegir llinell wag at ddechrau'r ffeil cod ffynhonnell, yna mae'r dadansoddwr yn deall, mewn gwirionedd, nad oes dim wedi newid, a bydd yn parhau i fod yn dawel. Gellir rhoi'r ffeil marcio hon mewn system rheoli fersiwn. Mae'r ffeil yn fawr, ond nid yw hyn yn broblem, gan nad oes diben ei storio'n aml.

Nawr bydd pob rhaglennydd yn gweld rhybuddion sy'n ymwneud â chod newydd neu wedi'i newid yn unig. Felly, gallwch chi ddechrau defnyddio'r dadansoddwr, fel maen nhw'n ei ddweud, o'r diwrnod wedyn. A gallwch ddychwelyd i ddyled dechnegol yn ddiweddarach, a chywiro gwallau yn raddol a ffurfweddu'r dadansoddwr.

Felly, mae'r broblem gyntaf gyda gweithrediad y dadansoddwr mewn hen brosiect mawr wedi'i datrys. Nawr gadewch i ni ddarganfod beth i'w wneud â dyled dechnegol.

Trwsio namau ac ailffactorau

Y peth symlaf a mwyaf naturiol yw neilltuo peth amser i ddadansoddi rhybuddion dadansoddwyr sydd wedi'u hatal yn aruthrol a delio â nhw'n raddol. Yn rhywle y dylech drwsio gwallau yn y cod, yn rhywle dylech ailffactorio i ddweud wrth y dadansoddwr nad yw'r cod yn broblemus. Enghraifft syml:

if (a = b)

Mae'r rhan fwyaf o gasglwyr a dadansoddwyr C++ yn cwyno am god o'r fath, gan fod tebygolrwydd uchel eu bod mewn gwirionedd eisiau ysgrifennu (a == b). Ond mae cytundeb di-lol, ac mae hyn fel arfer yn cael ei nodi yn y ddogfennaeth, os oes cromfachau ychwanegol, yna ystyrir bod y rhaglennydd wedi ysgrifennu cod o'r fath yn fwriadol, ac nid oes angen rhegi. Er enghraifft, yn y ddogfennaeth PVS-Studio ar gyfer diagnosteg V559 (CWE-481) mae wedi'i ysgrifennu'n glir y bydd y llinell ganlynol yn cael ei hystyried yn gywir ac yn ddiogel:

if ((a = b))

Enghraifft arall. A yw wedi'i anghofio yn y cod C++ hwn? torri ai peidio?

case A:
  foo();
case B:
  bar();
  break;

Bydd y dadansoddwr PVS-Studio yn rhoi rhybudd yma V796 (CWE-484). Efallai nad yw hyn yn gamgymeriad, ac os felly dylech roi awgrym i'r gramadegydd trwy ychwanegu'r priodoledd [[cwymp]] neu er enghraifft __nodwedd__((cwymp)):

case A:
  foo();
  [[fallthrough]];
case B:
  bar();
  break;

Gellir dweud nad yw newidiadau cod o'r fath yn trwsio'r nam. Ydy, mae hyn yn wir, ond mae'n gwneud dau beth defnyddiol. Yn gyntaf, mae adroddiad y dadansoddwr yn cael gwared ar bethau cadarnhaol ffug. Yn ail, mae'r cod yn dod yn fwy dealladwy i'r bobl sy'n ymwneud â'i gynnal. Ac mae hyn yn bwysig iawn! Ar gyfer hyn yn unig, mae'n werth gwneud mân addasiadau i wneud y cod yn gliriach ac yn haws i'w gynnal. Gan nad yw'r dadansoddwr yn deall a oes angen “torri” ai peidio, bydd hefyd yn aneglur i gyd-raglenwyr.

Yn ogystal ag atgyweiriadau nam ac ailffactorau, gallwch yn benodol atal rhybuddion dadansoddwr ffug amlwg. Gellir analluogi rhai diagnosteg amherthnasol. Er enghraifft, mae rhywun yn meddwl bod rhybuddion yn ddibwrpas V550 am gymharu gwerthoedd fflôt/dwbl. Ac mae rhai yn eu dosbarthu fel rhai pwysig a theilwng o astudiaeth [7]. Y tîm datblygu sydd i benderfynu pa rybuddion sy'n cael eu hystyried yn berthnasol a pha rai nad ydyn nhw.

Mae yna ffyrdd eraill o atal rhybuddion ffug. Er enghraifft, soniwyd am farcio macro yn gynharach. Disgrifir hyn i gyd yn fanylach yn y ddogfennaeth. Y peth pwysicaf yw deall, os byddwch chi'n mynd ati'n raddol ac yn systematig i weithio gyda phethau cadarnhaol ffug, nad oes dim o'i le arnyn nhw. Mae'r mwyafrif helaeth o rybuddion anniddorol yn diflannu ar ôl cyfluniad, a dim ond lleoedd sydd wir angen astudiaeth ofalus a rhai newidiadau yn y cod sy'n aros.

Hefyd, rydym bob amser yn helpu ein cleientiaid i sefydlu PVS-Studio os bydd unrhyw anawsterau'n codi. Ar ben hynny, bu achosion pan wnaethom ein hunain ddileu rhybuddion ffug a chywiro gwallau [8]. Rhag ofn, penderfynais sôn bod yr opsiwn hwn ar gyfer cydweithredu estynedig hefyd yn bosibl :).

Dull ratchet

Mae yna ddull diddorol arall o wella ansawdd cod yn raddol trwy ddileu rhybudd y dadansoddwr statig. Y gwir amdani yw mai dim ond lleihau y gall nifer y rhybuddion ei wneud.

Sut i weithredu dadansoddwr cod statig mewn prosiect etifeddiaeth heb ddigalonni'r tîm

Cofnodir nifer y rhybuddion a roddir gan y dadansoddwr statig. Mae giât ansawdd wedi'i ffurfweddu yn y fath fodd fel mai dim ond cod nad yw'n cynyddu nifer y gweithrediadau y gallwch chi ei nodi nawr. O ganlyniad, mae'r broses o leihau nifer y larymau yn raddol yn dechrau trwy addasu'r dadansoddwr a chywiro gwallau.

Hyd yn oed os yw person eisiau twyllo ychydig ac yn penderfynu pasio'r giât ansawdd nid trwy ddileu rhybuddion yn ei god newydd, ond trwy wella'r hen god trydydd parti, nid yw hyn yn frawychus. Yr un peth, mae'r glicied yn cylchdroi i un cyfeiriad, ac yn raddol bydd nifer y diffygion yn lleihau. Hyd yn oed os nad yw person eisiau trwsio ei ddiffygion newydd ei hun, bydd yn rhaid iddo wella rhywbeth yn y cod cyfagos o hyd. Ar ryw adeg, mae'r ffyrdd hawdd o leihau nifer y rhybuddion yn dod i ben, a daw pwynt pan fydd bygiau go iawn yn cael eu trwsio.

Disgrifir y fethodoleg hon yn fanylach mewn erthygl ddiddorol iawn gan Ivan Ponomarev "Rhowch ddadansoddiad statig ar waith yn y broses, yn hytrach na'i ddefnyddio i ddod o hyd i fygiau", yr wyf yn argymell ei ddarllen i unrhyw un sydd â diddordeb mewn gwella ansawdd cod.

Mae gan awdur yr erthygl hefyd adroddiad ar y pwnc hwn: "Dadansoddiad statig parhaus".

Casgliad

Rwy'n gobeithio, ar ôl yr erthygl hon, y bydd darllenwyr yn fwy parod i dderbyn offer dadansoddi statig ac yn awyddus i'w rhoi ar waith yn y broses ddatblygu. Os oes gennych unrhyw gwestiynau, rydym bob amser yn barod cynghori defnyddwyr ein dadansoddwr statig PVS-Studio a helpu gyda'i weithrediad.

Mae amheuon nodweddiadol eraill ynghylch a all dadansoddiad statig fod yn gyfleus ac yn ddefnyddiol mewn gwirionedd. Ceisiais chwalu’r rhan fwyaf o’r amheuon hyn yn y cyhoeddiad “Rhesymau dros gyflwyno’r dadansoddwr cod statig PVS-Studio i’r broses ddatblygu” [9].

Diolch am eich sylw a dewch скачать a rhowch gynnig ar y dadansoddwr PVS-Studio.

Dolenni ychwanegol

  1. Andrey Karpov. Sut alla i weld rhybuddion diddorol yn gyflym y mae'r dadansoddwr PVS-Studio yn eu cynhyrchu ar gyfer cod C a C ++?
  2. Wikipedia. Theorem Rice.
  3. Andrey Karpov, Victoria Khanieva. Defnyddio dysgu peirianyddol i ddadansoddi cod ffynhonnell rhaglen yn statig.
  4. PVS-Stiwdio. Dogfennaeth. Gosodiadau diagnostig ychwanegol.
  5. Andrey Karpov. Nodweddion y dadansoddwr PVS-Stiwdio gan ddefnyddio enghraifft Llyfrgelloedd Craidd EFL, 10-15% o bethau positif ffug.
  6. PVS-Stiwdio. Dogfennaeth. Ataliad màs o negeseuon dadansoddwr.
  7. Ivan Andryashin. Ynglŷn â sut y gwnaethom brofi dadansoddiad statig ar ein prosiect o efelychydd addysgol o lawdriniaeth endofasgwlaidd pelydr-X.
  8. Pavel Eremeev, Svyatoslav Razmyslov. Sut y gwnaeth tîm PVS-Studio wella cod Unreal Engine.
  9. Andrey Karpov. Rhesymau dros gyflwyno'r dadansoddwr cod statig PVS-Studio i'r broses ddatblygu.

Sut i weithredu dadansoddwr cod statig mewn prosiect etifeddiaeth heb ddigalonni'r tîm

Os ydych chi am rannu'r erthygl hon â chynulleidfa Saesneg ei hiaith, defnyddiwch y ddolen gyfieithu: Andrey Karpov. Sut i gyflwyno dadansoddwr cod statig mewn prosiect etifeddiaeth ac i beidio â digalonni'r tîm.

Ffynhonnell: hab.com

Ychwanegu sylw