Ahoana ny fametrahana mpanadihady kaody static amin'ny tetik'asa lova nefa tsy manakorontana ny ekipa

Ahoana ny fametrahana mpanadihady kaody static amin'ny tetik'asa lova nefa tsy manakorontana ny ekipa
Mora ny manandrana mpanadihady kaody static. Mila fahaiza-manao anefa ny fampiharana azy, indrindra amin’ny fampivoarana tetikasa lehibe efa tranainy. Raha tsy mety ny fanaovana dia afaka manampy asa, mampiadana ny fivoarana, ary mampihemotra ny ekipa ny mpandinika. Andeha isika hiresaka fohifohy momba ny fomba hanatonana araka ny tokony ho izy ny fampidirana ny famakafakana static amin'ny fizotran'ny fampandrosoana ary manomboka mampiasa azy ho ampahany amin'ny CI/CD.

fampidirana

Vao haingana no nisarika ny saiko tamin'ny famoahana "Manomboha amin'ny famakafakana static nefa tsy mandreraka ny ekipa". Amin'ny lafiny iray, ity dia lahatsoratra tsara izay mendrika ny hifankahalala. Amin'ny lafiny iray, toa ahy fa mbola tsy manome valiny feno momba ny fomba fampiharana tsy misy fanaintainana amin'ny famakafakana static amin'ny tetikasa misy be dia be. Lazain'ny lahatsoratra fa afaka manaiky trosa ara-teknika ianao ary tsy miasa afa-tsy amin'ny fehezan-dalàna vaovao, saingy tsy misy valiny ny tokony hatao amin'ity trosa ara-teknika ity any aoriana.

Ny ekipanay PVS-Studio dia manolotra ny heviny momba ity lohahevitra ity. Andeha hojerentsika ny fomba nipoiran'ny olana amin'ny fametrahana code static analyzer amin'ny toerana voalohany, ny fomba handresena ity olana ity, ary ny fomba hanafoanana tsikelikely ny trosa ara-teknika.

NY ANY

Matetika dia tsy sarotra ny manomboka sy mijery ny fomba fiasan'ny mpandinika static [1]. Mety hahita hadisoana mahaliana ianao na mety ho fahalemena mampatahotra mihitsy aza ao amin'ny kaody. Azonao atao mihitsy aza ny manamboatra zavatra, fa avy eo dia maro ny programmer no kivy.

Ny analyse static rehetra dia mamokatra valiny diso. Ity dia singa iray amin'ny fomba famakafakana kaody static, ary tsy misy azo atao momba izany. Amin'ny tranga ankapobeny, olana tsy voavaha io, araka ny nohamafisin'ny theorem's Rice [2]. Tsy hanampy koa ny algorithm fianarana milina [3]. Na dia tsy afaka milaza foana aza ny olona iray na diso io na io code io, dia tsy tokony hanantena izany amin'ny programa ianao :).

Tsy olana ny false positives raha toa ka efa namboarina ny mpandinika static:

  • Fitsipika tsy misy ifandraisany no kilemaina;
  • Ny diagnostika tsy misy ifandraisany sasany dia tsy voafehy;
  • Raha miresaka momba ny C na C ++ isika, dia voamarika ny macro izay misy fananganana manokana izay miteraka fampitandremana tsy misy ilàna azy amin'ny toerana rehetra ampiasaina amin'ny macro toy izany;
  • Ny fiasa manokana dia voamarika izay manao hetsika mitovy amin'ny fiasan'ny rafitra (ny analogue azy manokana memcpy na printf) [4];
  • Ny fanenjehana diso dia kilemaina manokana amin'ny fampiasana fanehoan-kevitra;
  • Ary dia toy izany koa.

Amin'ity tranga ity, afaka manantena ny tahan'ny tsara diso ambany isika eo amin'ny 10-15% [5]. Raha lazaina amin'ny teny hafa, ny fampitandremana 9 amin'ny 10 amin'ny mpandinika dia manondro olana tena izy amin'ny fehezan-dalàna, na farafaharatsiny "kaody mahery fofona." Ekeo fa tena mahafinaritra ity toe-javatra ity, ary ny mpandinika dia tena naman'ny programer.

Ahoana ny fametrahana mpanadihady kaody static amin'ny tetik'asa lova nefa tsy manakorontana ny ekipa
Raha ny marina, amin'ny tetikasa lehibe iray, ny sary voalohany dia ho hafa tanteraka. Mamoaka fampitandremana an-jatony na an'arivony ny mpandinika momba ny kaody lova. Tsy azo atao ny mahatakatra haingana hoe iza amin'ireo fampitandremana ireo no manan-danja ary iza no tsy. Tsy mitombina ny mipetraka sy manomboka miatrika ireo fampitandremana rehetra ireo, satria hijanona mandritra ny andro na herinandro ny asa lehibe amin'ity tranga ity. Amin'ny ankapobeny, ny ekipa iray dia tsy afaka manao scenario toy izany. Hisy ihany koa ny diff marobe izay manimba ny tantaran'ny fiovana. Ary ny fanitsiana faobe haingana ny sombiny maro be ao amin'ny kaody dia tsy maintsy hiteraka fahadisoana sy fahadisoana vaovao.

Ary ny tena zava-dehibe dia tsy dia misy dikany loatra ny zava-bita toy izany amin'ny ady amin'ny fampitandremana. Ekeo fa hatramin'ny nandehanan'ny tetikasa nandritra ny taona maro, dia efa voahitsy ny ankamaroan'ny fahadisoana lehibe ao anatiny. Eny, lafo be ireo fanamboarana ireo, tsy maintsy nofafana, nahazo fanehoan-kevitra ratsy momba ny bibikely, sy ny sisa. Ny mpandinika static dia hanampy amin'ny famahana ny maro amin'ireo lesoka ireo amin'ny dingana fanodinana, haingana sy mora. Saingy amin'izao fotoana izao, na amin'ny fomba iray na amin'ny fomba hafa, ireo lesoka ireo dia raikitra, ary ny mpandinika dia mahita ny fahadisoana tsy mitsikera indrindra amin'ny code taloha. Ity kaody ity dia mety tsy ampiasaina, mety tsy dia ampiasaina loatra, ary ny fahadisoana ao aminy dia mety tsy miteraka voka-dratsy. Angamba misy loko diso ny aloka avy amin'ny bokotra, saingy tsy manelingelina ny fampiasana ny vokatra izany.

Mazava ho azy fa na ny fahadisoana kely aza dia mbola fahadisoana ihany. Ary indraindray ny fahadisoana dia afaka manafina ny tena vulnerability. Na izany aza, toy ny hevitra mampiahiahy ny fandavana ny zava-drehetra sy ny fandaniana andro/herinandro hiatrehana ireo lesoka zara raha miseho.

Ny mpandrindra dia mijery, mijery, mijery ireo fampitandremana rehetra momba ny fehezan-dalàna miasa taloha ... Ary mieritreritra izy ireo: afaka manao tsy misy famakafakana static isika. Andao hanoratra endri-javatra mahasoa vaovao.

Amin'ny fombany manokana, marina izy ireo. Mihevitra izy ireo fa tsy maintsy manala ireo fampitandremana rehetra ireo aloha izy ireo. Amin'izay fotoana izay ihany izy ireo no hahazo tombony amin'ny fampiasana tsy tapaka ny mpanadihady kaody. Raha tsy izany, ny fampitandremana vaovao dia hilentika fotsiny amin'ny fampitandremana taloha, ary tsy hisy olona hiraharaha izany.

Izany dia mitovy amin'ny fampitandremana amin'ny mpamoron-kira. Tsy noho ny antony no nanoroan'izy ireo ny fitazonana ny isan'ny fampitandremana mpanangona ho 0. Raha misy fampitandremana 1000, dia rehefa misy 1001 dia tsy hisy hiraharaha izany, ary tsy hita izay hitadiavana ity fampitandremana vaovao ity.

Ahoana ny fametrahana mpanadihady kaody static amin'ny tetik'asa lova nefa tsy manakorontana ny ekipa
Ny zavatra ratsy indrindra amin'ity tantara ity dia raha misy olona avy any ambony manery anao hampiasa famakafakana code static. Hanala baraka ny ekipa ihany izany, satria raha ny fomba fijerin'izy ireo dia hisy fahasarotana ara-birokratika fanampiny izay manelingelina fotsiny. Tsy misy olona hijery ny tatitry ny mpanadihady, ary ny fampiasana rehetra dia "amin'ny taratasy" ihany. Ireo. Amin'ny fomba ofisialy, ny famakafakana dia natsangana ao amin'ny dingana DevOps, saingy amin'ny fampiharana dia tsy mahasoa na iza na iza izany. Nandre tantara an-tsipiriany tao amin'ny trano heva avy amin'ireo mpanatrika ny fihaonambe izahay. Ny traikefa toy izany dia mety hanakivy ny mpandrindra amin'ny fampiasana fitaovana famakafakana static mandritra ny fotoana maharitra, raha tsy mandrakizay.

Fampiharana sy fanafoanana ny trosa ara-teknika

Raha ny marina, tsy misy sarotra na mampatahotra ny fampidirana fanadihadiana static na dia amin'ny tetikasa tranainy lehibe aza.

CI / CD

Ankoatr'izay, ny mpandinika dia azo atao avy hatrany ao anatin'ny dingana fampandrosoana mitohy. Ohatra, ny fizarana PVS-Studio dia misy fitaovana ahafahana mijery tsara ny tatitra amin'ny endrika ilainao, ary fampandrenesana ho an'ny mpamorona izay nanoratra fizarana olana amin'ny kaody. Ho an'ireo izay liana kokoa amin'ny fandefasana ny PVS-Studio avy amin'ny rafitra CI/CD, dia manoro hevitra anao aho mba hahalalanao ny mifanaraka amin'izany. faritra antontan-taratasy sy andian-dahatsoratra:

Fa andeha isika hiverina amin'ny olana momba ny latsa-danja marobe amin'ny dingana voalohany amin'ny fampiharana ny fitaovana famakafakana code.

Fanamboarana trosa ara-teknika efa misy ary fiatrehana fampitandremana vaovao

Ireo mpandinika static ara-barotra maoderina dia mamela anao hianatra fampitandremana vaovao izay miseho amin'ny kaody vaovao na niova. Ny fampiharana an'io mekanika io dia miovaova, fa ny fotony dia mitovy. Ao amin'ny mpandinika static PVS-Studio, ity fiasa ity dia ampiharina toy izao manaraka izao.

Mba hanombohana haingana ny fampiasana famakafakana static, dia manoro hevitra ny mpampiasa PVS-Studio izahay hampiasa ny fomba fanafoanana faobe ny fampitandremana [6]. Ny hevitra ankapobeny dia izao manaraka izao. Nandefa ny mpandinika ilay mpampiasa ary nahazo fampitandremana maro. Koa satria ny tetikasa iray izay efa teo amin'ny fampandrosoana nandritra ny taona maro dia velona, ​​mivelatra ary mahazo vola, dia azo inoana fa tsy hisy fampitandremana firy ao amin'ny tatitra milaza fa misy lesoka lehibe. Raha lazaina amin'ny teny hafa, ireo bibikely mitsikera dia efa namboarina tamin'ny fomba iray na hafa tamin'ny fampiasana fomba lafo kokoa na noho ny fanehoan-kevitra avy amin'ny mpanjifa. Noho izany, ny zava-drehetra izay hitan'ny mpanadihady amin'izao fotoana izao dia azo raisina ho trosa ara-teknika, izay tsy azo atao ny manandrana manala avy hatrany.

Azonao atao ny milaza amin'ny PVS-Studio mba handinika ireo fampitandremana ireo ho tsy manan-danja amin'izao fotoana izao (mitahiry trosa ara-teknika ho an'ny aoriana), ary tsy hampiseho azy ireo intsony izany. Ny analyse dia mamorona rakitra manokana izay mitahiry vaovao momba ny fahadisoana izay tsy mbola mahaliana. Ary ankehitriny ny PVS-Studio dia hamoaka fampitandremana ho an'ny kaody vaovao na niova ihany. Ambonin'izany, izany rehetra izany dia ampiharina amim-pahakingana. Raha, ohatra, ny tsipika tsy misy na inona na inona ampiana eo am-piandohan'ny rakitra loharano, dia takatr'ilay mpandinika fa, raha ny marina, tsy nisy fiovana, ary mbola hangina. Ity rakitra marika ity dia azo apetraka amin'ny rafitra fanaraha-maso ny dikan-teny. Lehibe ny rakitra, saingy tsy olana izany, satria tsy misy dikany ny fitahirizana azy matetika.

Ankehitriny ny mpandrindra rehetra dia hahita fampitandremana mifandraika amin'ny kaody vaovao na niova ihany. Noho izany, afaka manomboka mampiasa ny analyse ianao, araka ny filazan'izy ireo, manomboka amin'ny ampitso. Ary afaka miverina amin'ny trosa ara-teknika ianao any aoriana, ary manitsy tsikelikely ny lesoka ary manamboatra ny mpandinika.

Noho izany, voavaha ny olana voalohany amin'ny fampiharana ny analyse amin'ny tetikasa lehibe taloha. Andeha hojerentsika izay tokony hatao amin'ny trosa ara-teknika.

Fanamboarana bug sy refactorings

Ny zavatra tsotra sy voajanahary indrindra dia ny hanokana fotoana handinihana ireo fampitandremana mpandinika faobe ary hiatrehana azy ireo tsikelikely. Any amin'ny toerana iray dia tokony amboarinao ny lesoka ao amin'ny kaody, any amin'ny toerana iray ianao dia tokony refactor mba hilaza amin'ny mpanadihady fa tsy olana ny code. Ohatra tsotra:

if (a = b)

Ny ankamaroan'ny C ++ compiler sy mpandinika dia mitaraina momba ny kaody toy izany, satria misy ny mety ho tian'izy ireo hanoratra (a == b). Fa misy fifanarahana tsy voalaza, ary izany matetika no voamarika ao amin'ny antontan-taratasy, fa raha misy fanampiny fononteny, dia heverina fa ny programmer dia ninia nanoratra toy izany kaody, ary tsy ilaina ny mianiana. Ohatra, ao amin'ny antontan-taratasy PVS-Studio ho an'ny diagnostika V559 (CWE-481) voasoratra mazava tsara fa ity andalana manaraka ity dia heverina ho marina sy azo antoka:

if ((a = b))

Ohatra iray hafa. Adino amin'ity kaody C++ ity ve? break na tsia?

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

Ny mpanadihady PVS-Studio dia hamoaka fampitandremana eto V796 (CWE-484). Mety tsy hadisoana izany, ka amin'izay dia tokony hanome soso-kevitra ny parser ianao amin'ny fampidirana ilay toetra [[fahavalo]] na ohatra __attribute__((midina)):

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

Azo lazaina fa ny fanovana code toy izany dia tsy manamboatra ny bug. Eny, marina izany, saingy misy zavatra roa mahasoa. Voalohany, ny tatitry ny analyse dia manala ny fanendrikendrehana diso. Faharoa, ny fehezan-dalàna dia lasa takatry ny olona mandray anjara amin'ny fikojakojana azy. Ary tena zava-dehibe izany! Ho an'ity fotsiny, mendrika ny manao refactorings kely mba hampahazava kokoa ny kaody sy ho mora kokoa ny fikojakojana. Koa satria tsy azon'ilay mpandinika raha ilaina na tsia ny "fitsaharana", dia tsy hazava ho an'ny mpiara-programa koa izany.

Ho fanampin'ny fanamboarana bug sy refactorings, azonao atao ny manafoana manokana ny fampitandremana mpandinika diso. Ny diagnostika tsy misy ifandraisany sasany dia mety ho kilemaina. Misy mihevitra, ohatra, fa tsy misy dikany ny fampitandremana V550 momba ny fampitahana ny soatoavina float/double. Ary ny sasany dia manasokajy azy ireo ho manan-danja sy mendrika ny fianarana [7]. Izay fampitandremana heverina ho manan-danja ary iza no tsy miankina amin'ny ekipa fampandrosoana no manapa-kevitra.

Misy fomba hafa hanakanana ny fanairana diso. Ohatra, ny marika macro dia voalaza teo aloha. Izany rehetra izany dia voafaritra amin'ny antsipiriany ao amin'ny antontan-taratasy. Ny zava-dehibe indrindra dia ny mahatakatra fa raha manatona tsikelikely sy mirindra amin'ny fiasana amin'ny fanenjehana diso ianao, dia tsy misy maharatsy azy ireo. Ny ankamaroan'ny fampitandremana tsy mahaliana dia manjavona aorian'ny fanamafisana, ary ny toerana tena mila fandinihana amim-pitandremana sy ny fanovana sasany amin'ny kaody ihany no mijanona.

Ary koa, manampy ny mpanjifanay foana izahay hametraka PVS-Studio raha misy olana mitranga. Ankoatra izany, dia nisy tranga izay nanaisotra ny fampitandremana diso sy nanitsy ny fahadisoana [8]. Raha sanatria, dia nanapa-kevitra ny hilaza aho fa azo atao ihany koa io safidy ho an'ny fiaraha-miasa maharitra :).

Ratchet fomba

Misy fomba hafa mahaliana hanatsara tsikelikely ny kalitaon'ny kaody amin'ny fanafoanana ny fampitandremana mpanadihady static. Ny fehin-kevitra dia hoe ny isan'ny fampitandremana ihany no mety hihena.

Ahoana ny fametrahana mpanadihady kaody static amin'ny tetik'asa lova nefa tsy manakorontana ny ekipa

Voarakitra an-tsoratra ny isan'ny fampitandremana navoakan'ny mpandinika static. Ny vavahadin'ny kalitao dia natsangana tamin'ny fomba izay ahafahanao miditra code izay tsy mampitombo ny isan'ny asa. Vokatr'izany, ny dingana amin'ny fampihenana tsikelikely ny isan'ny fanairana dia manomboka amin'ny fanitsiana ny mpandinika sy ny fanitsiana ny lesoka.

Na dia te hamitaka kely aza ny olona iray ary manapa-kevitra ny handalo ny vavahadin'ny kalitao tsy amin'ny fanafoanana ny fampitandremana ao amin'ny fehezan-dalàna vaovao, fa amin'ny fanatsarana ny fehezan-dalàna taloha, dia tsy mampatahotra izany. Toy izany koa, mihodina amin'ny lalana iray ny ratchet, ary mihena tsikelikely ny isan'ny lesoka. Na dia tsy te hanitsy ny kilemany vaovao aza ny olona iray, dia mbola tsy maintsy manatsara zavatra ao amin'ny code manodidina izy. Amin'ny fotoana iray dia tapitra ny fomba mora hampihenana ny isan'ny fampitandremana, ary tonga ny fotoana handaminana ireo bibikely tena izy.

Ity fomba fiasa ity dia nofaritana amin'ny antsipiriany bebe kokoa amin'ny lahatsoratra tena mahaliana nataon'i Ivan Ponomarev "Ampiharo ny famakafakana static ao anatin'ilay dingana, fa tsy mitady bibikely miaraka aminy", izay manoro hevitra aho hamaky ho an'izay liana amin'ny fanatsarana ny kalitaon'ny code.

Ny mpanoratra ny lahatsoratra koa dia manana tatitra momba ity lohahevitra ity: "Fanadihadiana static mitohy".

famaranana

Manantena aho fa aorian'ity lahatsoratra ity, ny mpamaky dia hanaiky bebe kokoa ny fitaovana famakafakana static ary haniry ny hampihatra izany amin'ny dingana fampandrosoana. Raha manana fanontaniana ianao dia vonona foana izahay manoro hevitra mpampiasa ny static analyzer PVS-Studio ary manampy amin'ny fampiharana azy.

Misy fisalasalana mahazatra hafa momba ny hoe mety ho mety sy mahasoa tokoa ny fanadihadiana static. Niezaka nanala ny ankamaroan'ireo fisalasalana ireo aho tao amin'ny famoahana "Antony hampidirana ny PVS-Studio static code analyzer amin'ny dingana fampandrosoana" [9].

Misaotra anao noho ny fiheveranao ary tongava скачать ary andramo ny analyser PVS-Studio.

Rohy fanampiny

  1. Andrey Karpov. Ahoana no ahitako haingana ireo fampitandremana mahaliana izay vokarin'ny mpandinika PVS-Studio ho an'ny kaody C sy C ++?
  2. Wikipedia. Ny teôreman'ny vary.
  3. Andrey Karpov, Victoria Khanieva. Mampiasa fianarana milina amin'ny famakafakana static ny code source program.
  4. PVS-Studio. Documentation. Fikirana diagnostika fanampiny.
  5. Andrey Karpov. Toetran'ny mpandinika PVS-Studio mampiasa ny ohatra momba ny EFL Core Libraries, 10-15% diso.
  6. PVS-Studio. Documentation. Famoretana faobe ny hafatra analyser.
  7. Ivan Andryashin. Momba ny fomba nanandramana fanadihadiana static tamin'ny tetikasanay momba ny simulator fanabeazana momba ny fandidiana endovascular X-ray.
  8. Pavel Eremeev, Svyatoslav Razmyslov. Ny fomba nanatsaran'ny ekipa PVS-Studio ny code Unreal Engine.
  9. Andrey Karpov. Antony hampidirana ny mpanadihady kaody static PVS-Studio amin'ny dingana fampandrosoana.

Ahoana ny fametrahana mpanadihady kaody static amin'ny tetik'asa lova nefa tsy manakorontana ny ekipa

Raha te hizara ity lahatsoratra ity amin'ny mpihaino miteny anglisy ianao dia ampiasao ny rohy fandikan-teny: Andrey Karpov. Ahoana ny fampidirana mpanadihady kaody static amin'ny tetikasa lova ary tsy hanakivy ny ekipa.

Source: www.habr.com

Add a comment