Ka nānā 'ana i ka static - mai ka hoʻomaka a hiki i ka hoʻohui

Luhi i ka loiloi code pau ʻole a i ʻole debugging, i kekahi manawa e noʻonoʻo ʻoe pehea e maʻalahi ai kou ola. A ma hope o ka ʻimi ʻana i kahi liʻiliʻi, a i ʻole ma ka hāʻule ʻole ʻana ma luna o ia mea, hiki iā ʻoe ke ʻike i ka ʻōlelo kilokilo: "Static analysis." E ʻike kākou he aha ia a pehea e hiki ai ke launa pū me kāu papahana.

Ka nānā 'ana i ka static - mai ka hoʻomaka a hiki i ka hoʻohui
ʻO ka ʻoiaʻiʻo, inā ʻoe e kākau i kekahi ʻōlelo hou, a laila, me ka ʻike ʻole ʻole, ua holo ʻoe iā ia ma o kahi ananaly static. ʻO ka mea ʻoiaʻiʻo, hāʻawi kekahi mea hōʻuluʻulu hou, ʻoiai he liʻiliʻi liʻiliʻi, hoʻonohonoho o nā ʻōlelo aʻo e pili ana i nā pilikia i loko o ke code. No ka laʻana, i ka hōʻuluʻulu ʻana i ka code C++ ma Visual Studio e ʻike paha ʻoe i kēia:

Ka nānā 'ana i ka static - mai ka hoʻomaka a hiki i ka hoʻohui
Ma kēia hoʻopuka ʻike mākou i ka loli var ʻaʻole i hoʻohana ʻia ma nā wahi āpau o ka hana. No laila ʻo ka ʻoiaʻiʻo, ʻaneʻane hoʻohana mau ʻoe i kahi mea helu helu static maʻalahi. Eia nō naʻe, ʻaʻole e like me nā loiloi ʻoihana e like me Coverity, Klocwork a i ʻole PVS-Studio, ʻo nā ʻōlelo aʻo i hāʻawi ʻia e ka mea hoʻopili e hōʻike wale i kahi pilikia liʻiliʻi.

Inā ʻaʻole ʻoe maopopo i ke ʻano o ka loiloi static a pehea e hoʻokō ai, heluhelu i keia 'atikalae aʻo hou e pili ana i kēia ʻano hana.

No ke aha ʻoe e pono ai i ka loiloi static?

Ma kahi pōkole: ka wikiwiki a me ka maʻalahi.

Hiki iā ʻoe ke ʻimi i nā pilikia like ʻole i loko o ke code: mai ka hoʻohana hewa ʻole ʻana i nā kūkulu ʻōlelo a hiki i nā typos. No ka laʻana, ma kahi o

auto x = obj.x;
auto y = obj.y;
auto z = obj.z;

Ua kākau ʻoe i kēia code:

auto x = obj.x;
auto y = obj.y;
auto z = obj.x;

E like me kāu e ʻike ai, aia kahi typo ma ka laina hope. No ka laʻana, hoʻopuka ʻo PVS-Studio i kēia ʻōlelo aʻo:

V537 E noʻonoʻo e nānā i ka pololei o ka hoʻohana ʻana o ka mea 'y'.

Inā makemake ʻoe e hoʻokomo i kou mau lima i kēia hewa, e hoʻāʻo i kahi hiʻohiʻona mākaukau ma Compiler Explorer: *uwe*.

A e like me kāu e hoʻomaopopo ai, ʻaʻole hiki ke hoʻolohe koke i kēlā mau ʻāpana o ke code, a no kēia, hiki iā ʻoe ke noho i lalo i ka debugging no kahi hola maikaʻi, e noʻonoʻo ana i ke kumu o ka hana ʻana o nā mea āpau.

Eia nō naʻe, he kuhihewa kēia. He aha inā ua kākau ka mea hoʻomohala i ke code suboptimal no ka mea ua poina iā ia kekahi maʻalahi o ka ʻōlelo? A i ʻole i ʻae ʻia i loko o ke code ʻano ʻike ʻole? ʻO ka mea pōʻino, he mea maʻamau ia mau hihia a ʻo ka hapa o ka liona ka manawa i hoʻopau ʻia i ka hana ʻana i nā code i loaʻa nā typos, nā hewa maʻamau a i ʻole nā ​​​​hana i wehewehe ʻole ʻia.

No kēia mau kūlana i ʻike ʻia ai ka nānā ʻana static. He mea kōkua kēia no ka mea hoʻomohala nāna e kuhikuhi i nā pilikia like ʻole i ke code a wehewehe i ka palapala i ke kumu e pono ʻole ai ke kākau i kēia ala, he aha ia e alakaʻi ai a pehea e hoʻoponopono ai. Eia kekahi laʻana o ke ʻano o kona ʻano: *uwe*.

Hiki iā ʻoe ke ʻike i nā hewa hoihoi hou aʻe i ʻike ʻia e ka mea hoʻoponopono ma nā ʻatikala:

I kēia manawa ua heluhelu ʻoe i kēia ʻatikala a ua manaʻoʻiʻo ʻoe i nā pōmaikaʻi o ka loiloi static, makemake paha ʻoe e hoʻāʻo. Akā ma hea e hoʻomaka ai? Pehea e hoʻohui ai i kahi mea hana hou i kāu papahana o kēia manawa? A pehea e hoʻolauna ai i ka hui iā ia? E ʻike ʻoe i nā pane i kēia mau nīnau ma lalo nei.

Nānā: ʻAʻole hoʻololi a hoʻopau paha ka loiloi static i kahi mea pono e like me nā loiloi code. Hoʻopiha ia i kēia kaʻina hana, kōkua i ka ʻike a hoʻoponopono i nā typos, nā hemahema, a me nā hoʻolālā weliweli ma mua. ʻOi aku ka maikaʻi o ka nānā ʻana i nā loiloi code ma nā algorithms a me ka maopopo o ka code, ma mua o ka ʻimi ʻana i kahi pale kuhi hewa a i ʻole. heluhelu i nā hana hoʻohālikelike ʻoluʻolu.

0. E ʻike i ka mea hana

Hoʻomaka ia me kahi mana hoʻāʻo. ʻOiaʻiʻo, paʻakikī ke hoʻoholo e hoʻokomo i kahi mea i ke kaʻina hana hoʻomohala inā ʻaʻole ʻoe i ʻike i ka mea hana ma mua. No laila, ʻo ka mea mua e pono ai ʻoe e hoʻoiho ʻano hoʻāʻo.

He aha kāu e aʻo ai ma kēia pae:

  • He aha nā ala e launa pū ai me ka mea hoʻoponopono;
  • Ua kūpono anei ka mea kālailai me kou wahi hoʻomohala?
  • He aha nā pilikia i kēia manawa i kāu mau papahana?

Ma hope o ka hoʻokomo ʻana i nā mea āpau āu e pono ai, ʻo ka mea mua āu e hana ai ʻo ka holo ʻana i kahi loiloi o ka papahana holoʻokoʻa (Windows, Linux, macOS). I ka hihia o PVS-Studio ma Visual Studio e ʻike ʻoe i kahi kiʻi like (hiki ke kaomi):

Ka nānā 'ana i ka static - mai ka hoʻomaka a hiki i ka hoʻohui
ʻO ka ʻoiaʻiʻo, hoʻopuka pinepine nā mea loiloi static i ka nui o nā ʻōlelo luhi no nā papahana me kahi kumu code nui. ʻAʻohe pono e hoʻoponopono iā lākou a pau, ʻoiai ke hana nei kāu papahana, ʻo ia hoʻi, ʻaʻole koʻikoʻi kēia mau pilikia. Eia naʻe, ʻo ʻoe hiki iā ʻoe ke nānā i nā ʻōlelo aʻo hoihoi loa a hoʻoponopono iā lākou inā pono. No ka hana ʻana i kēia, pono ʻoe e kānana i ka hopena a waiho wale i nā memo hilinaʻi. Ma ka PVS-Studio plugin no Visual Studio, hana ʻia kēia ma ke kānana ʻana e nā pae hewa a me nā ʻāpana. No ka hoʻopuka pololei loa, waiho wale High и Nui (hiki ke kaomi):

Ka nānā 'ana i ka static - mai ka hoʻomaka a hiki i ka hoʻohui
ʻOiaʻiʻo, ʻoi aku ka maʻalahi o nā ʻōlelo aʻo 178 ma mua o nā tausani ...

Ma nā papa Medium и Low Loaʻa pinepine nā ʻōlelo aʻo maikaʻi, akā aia kēia mau ʻāpana i kēlā mau diagnostics i emi ʻole ka pololei (kūpono). Hiki ke loaʻa ka ʻike hou aku e pili ana i nā pae ʻōlelo aʻo a me nā koho no ka hana ʻana ma lalo o Windows: *uwe*.

Ma hope o ka loiloi maikaʻi ʻana i nā hewa hoihoi loa (a hoʻoponopono maikaʻi iā lākou) pono kaohi i nā ʻōlelo aʻo i koe. Pono kēia i ʻole e nalowale nā ​​ʻōlelo aʻo hou i waena o nā mea kahiko. Eia kekahi, he mea kōkua ka mea hoʻoponopono static no ka mea papahana, ʻaʻole ka papa inoa o nā pōpoki. 🙂

1. Ka 'aunoa

Ma hope o ka ʻike ʻana, ʻo ia ka manawa e hoʻonohonoho i nā plugins a hoʻohui i ka CI. Pono e hana ʻia kēia ma mua o ka hoʻomaka ʻana o ka poʻe polokalamu polokalamu i ka hoʻohana ʻana i ka mea hōʻike static. ʻO ka ʻoiaʻiʻo, hiki i ka mea polokalamu ke poina i ka hiki ʻana i ka nānā ʻana a ʻaʻole makemake paha e hana. No ka hana ʻana i kēia, pono ʻoe e hana i kahi nānā hope loa o nā mea āpau i hiki ʻole ke komo i ka code untested i loko o ka lālā hoʻomohala maʻamau.

He aha kāu e aʻo ai ma kēia pae:

  • He aha nā koho automation e hāʻawi ai ka mea hana;
  • Ua kūpono anei ka mea anaana me kāu ʻōnaehana hui?

No ka loaʻa ʻole o nā palapala hemolele, i kekahi manawa pono ʻoe e kākau i loko kākoʻo. He mea maʻamau kēia a hauʻoli mākou e kōkua iā ʻoe. 🙂

I kēia manawa e neʻe kākou i nā lawelawe hoʻohui mau (CI). Hiki ke hoʻokomo ʻia kēlā me kēia mea anamanaʻo iā lākou me ka ʻole o nā pilikia koʻikoʻi. No ka hana ʻana i kēia, pono ʻoe e hana i kahi kaʻawale i ka pipeline, kahi maʻamau ma hope o ke kūkulu ʻana a me nā hoʻāʻo ʻana. Hana ʻia kēia me ka hoʻohana ʻana i nā pono console. No ka laʻana, hāʻawi ʻo PVS-Studio i kēia mau mea pono:

No ka hoʻohui ʻana i ka nānā ʻana i ka CI, pono ʻoe e hana i ʻekolu mau mea:

  • E hoʻouka i ka mea hōʻike;
  • Holo ka nānā ʻana;
  • Hāʻawi i nā hopena.

No ka laʻana, e hoʻokomo i ka PVS-Studio ma Linux (Debian-base), pono ʻoe e holo i kēia mau kauoha:

wget -q -O - https://files.viva64.com/etc/pubkey.txt 
    | sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list 
  https://files.viva64.com/etc/viva64.list
  
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio

Ma nā ʻōnaehana e holo ana i ka Windows, ʻaʻohe ala e hoʻokomo ai i ka mea anaana mai ka luna pūʻulu, akā hiki ke kau i ka mea anaana mai ka laina kauoha:

PVS-Studio_setup.exe /verysilent /suppressmsgboxes 
/norestart /nocloseapplications

Hiki iā ʻoe ke heluhelu hou aʻe e pili ana i ka lawe ʻana i ka PVS-Studio ma nā ʻōnaehana holo Windows *maanei*.

Ma hope o ka hoʻouka ʻana, pono ʻoe e holo pololei i ka nānā ʻana. Eia nō naʻe, ʻōlelo ʻia e hana i kēia wale nō ma hope o ka hōʻuluʻulu ʻana a ua hala nā hoʻokolohua. ʻO kēia no ka mea ʻoi aku ka lōʻihi o ka hoʻopaʻa ʻana static i ʻelua manawa ma mua o ka hoʻopili ʻana.

Ma muli o ke ʻano o ka hoʻomaka ʻana e pili ana i ka paepae a me nā hiʻohiʻona papahana, e hōʻike wau i ke koho no C ++ (Linux) ma ke ʻano he laʻana:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w

ʻO ke kauoha mua e hana i ka loiloi, a ʻo ka lua nā envelopeshoʻololi i ka hōʻike i loko o ke kikokikona, hōʻike iā ia ma ka pale a hoʻihoʻi i kahi code hoʻihoʻi ma mua o 0 inā loaʻa nā ʻōlelo aʻo. Hiki ke hoʻohana maʻalahi i kahi mīkini e like me kēia no ka pale ʻana i kahi kūkulu inā loaʻa nā memo hewa. Eia naʻe, hiki iā ʻoe ke wehe i ka hae -w a mai ālai i kahi anaina i loaʻa nā ʻōlelo aʻo.

Nānā: ʻAʻole kūpono ke ʻano kikokikona. Hāʻawi ʻia ia ma ke ʻano he laʻana. E noʻonoʻo i kahi hōʻike hōʻike hoihoi - FullHtml. Hiki iā ʻoe ke hoʻokele i ke code.

Hiki iā ʻoe ke heluhelu hou aʻe e pili ana i ka hoʻonohonoho ʻana i ka loiloi ma CI ma ka ʻatikala "PVS-Studio a me ka hoʻohui mau"(Windows) a i ʻole "Pehea e hoʻonohonoho ai i ka PVS-Studio ma Travis CI"(Linux).

ʻAe, ua hoʻonohonoho ʻoe i ka mea hōʻike ma ke kikowaena kūkulu. I kēia manawa, inā hoʻouka kekahi i ka code untested, e hāʻule ka pae hōʻoia, a hiki iā ʻoe ke ʻike i ka pilikia, akā naʻe, ʻaʻole maʻalahi kēia, no ka mea ʻoi aku ka maikaʻi o ka nānā ʻana i ka papahana ʻaʻole ma hope o ka hui ʻana o nā lālā, akā. ma mua o ia, ma ke kahua noi huki.

Ma keʻano laulā, ʻaʻole ʻokoʻa loa ka hoʻonohonoho ʻana i kahi loiloi noi huki mai ka hoʻomaka maʻamau o kahi loiloi ma CI. Koe wale no ka pono e kiʻi i kahi papa inoa o nā faila i hoʻololi ʻia. Hiki ke loaʻa i kēia mau mea ma ka nīnau ʻana i nā ʻokoʻa ma waena o nā lālā me ka hoʻohana ʻana i ka git:

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

I kēia manawa, pono ʻoe e hāʻawi i kēia papa inoa o nā faila i ka mea hoʻopili ma ke ʻano he hoʻokomo. No ka laʻana, ma PVS-Studio ua hoʻokō ʻia kēia me ka hoʻohana ʻana i ka hae -S:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log 
                            -S .pvs-pr.list

Hiki iā ʻoe ke ʻike hou aku e pili ana i ka nānā ʻana i nā noi huki *maanei*. ʻOiai inā ʻaʻole kāu CI ma ka papa inoa o nā lawelawe i haʻi ʻia ma ka ʻatikala, e ʻike ʻoe i ka ʻāpana ākea i hoʻolaʻa ʻia i ke kumumanaʻo o kēia ʻano loiloi.

Ma ka hoʻonohonoho ʻana i ka nānā ʻana i nā noi huki, hiki iā ʻoe ke pale i nā hana i loaʻa nā ʻōlelo aʻo, a laila e hana i kahi palena ʻaʻole i hoʻāʻo ʻia ke code ʻaʻole hiki ke hele.

He mea maikaʻi kēia, akā makemake wau e ʻike i nā ʻōlelo aʻo a pau ma kahi hoʻokahi. ʻAʻole wale mai ka static analyzer, akā mai nā hoʻāʻo ʻāpana a i ʻole mai ka dynamic analyzer. Aia nā lawelawe like ʻole a me nā plugins no kēia. PVS-Studio, no ka laʻana, loaʻa plugin no ka hoʻohui ʻana i SonarQube.

2. Hoʻohui i nā mīkini hoʻomohala

ʻO ka manawa kēia e hoʻokomo a hoʻonohonoho i ka mea anana no ka hoʻohana ʻana i kēlā me kēia lā. I kēia manawa ua kamaʻāina ʻoe i ka hapa nui o nā ʻano hana, no laila hiki ke kapa ʻia ʻo ia ka ʻāpana maʻalahi.

E like me ke koho maʻalahi, hiki i nā mea hoʻomohala ke hoʻokomo i ka mea ananeli pono iā lākou iho. Eia naʻe, e lōʻihi ka manawa a hoʻohuli iā lākou mai ka hoʻomohala ʻana, no laila hiki iā ʻoe ke hoʻokaʻawale i kēia kaʻina hana me ka hoʻohana ʻana i kahi installer a me nā hae pono. No PVS-Studio aia nā ʻano like ʻole nā hae no ka hoʻokomo 'akomi. Eia nō naʻe, loaʻa mau nā mea hoʻokele pūʻulu, no ka laʻana, Chocolatey (Windows), Homebrew (macOS) a i ʻole ka nui o nā koho no Linux.

A laila pono ʻoe e hoʻokomo i nā plugins pono, no ka laʻana Ke kākoʻo Studio, MANAʻO, mea nāna e holo etc.

3. Hoʻohana i kēlā me kēia lā

I kēia pae, ʻo ia ka manawa e ʻōlelo ai i kekahi mau huaʻōlelo e pili ana i nā ala e wikiwiki ai i ka mea anana i ka wā e hoʻohana ai i kēlā me kēia lā. ʻO ka loiloi piha o ka papahana holoʻokoʻa e lōʻihi ka manawa, akā pehea ka manawa e hoʻololi ai mākou i ke code ma ka papahana holoʻokoʻa i ka manawa hoʻokahi? ʻAʻole hiki ke hoʻololi hou i ka nui a hiki ke hoʻopili koke i ke kumu code holoʻokoʻa. ʻAʻole ʻoi aku ka nui o nā faila i hoʻololi ʻia i ka manawa, no laila he mea kūpono ke nānā ʻana iā lākou. No ia kūlana aia ʻano hoʻolāʻau hoʻonui. Mai makaʻu wale ʻoe, ʻaʻole kēia mea hana ʻē aʻe. He ʻano kūikawā kēia e hiki ai iā ʻoe ke nānā i nā faila i hoʻololi wale ʻia a me ko lākou mau hilinaʻi, a hiki koke kēia ma hope o ke kūkulu ʻana inā ʻoe e hana ana i kahi IDE me ka plugin i hoʻokomo ʻia.

Inā ʻike ka mea loiloi i nā pilikia ma ke code i hoʻololi hou ʻia, e hōʻike kūʻokoʻa ia i kēia. No ka laʻana, e haʻi ʻo PVS-Studio iā ʻoe e pili ana i kēia me ka hoʻohana ʻana i kahi makaʻala:

Ka nānā 'ana i ka static - mai ka hoʻomaka a hiki i ka hoʻohui
ʻOiaʻiʻo, ʻaʻole lawa ka haʻi ʻana i nā mea hoʻomohala e hoʻohana i ka mea hana. Pono mākou e haʻi iā lākou i ke ʻano a me ke ʻano. Eia, no ka laʻana, he mau ʻatikala e pili ana i ka hoʻomaka wikiwiki ʻana no PVS-Studio, akā hiki iā ʻoe ke loaʻa nā aʻo like ʻole no nā mea hana āu e makemake ai:

Hāʻawi ia mau ʻatikala i nā ʻike āpau e pono ai no ka hoʻohana ʻana i kēlā me kēia lā a ʻaʻole nui ka manawa. 🙂

ʻOiai ma ke kahua o ka ʻike ʻana i ka hāmeʻa, ua kāohi mākou i nā ʻōlelo luhi i ka wā o kekahi o nā hoʻolaha mua. ʻO ka mea pōʻino, ʻaʻole maikaʻi nā mea loiloi static, no laila hāʻawi lākou i nā mea maikaʻi ʻole i kēlā me kēia manawa. He mea maʻalahi ke kāohi iā lākou; no ka laʻana, i ka PVS-Studio plugin no Visual Studio pono ʻoe e kaomi i hoʻokahi pihi:

Ka nānā 'ana i ka static - mai ka hoʻomaka a hiki i ka hoʻohui
Eia naʻe, hiki iā ʻoe ke hana i nā mea ʻē aʻe ma mua o ke kāohi wale ʻana iā lākou. No ka laʻana, hiki iā ʻoe ke hōʻike i kahi pilikia e kākoʻo. Inā hiki ke hoʻoponopono ʻia ka maikaʻi wahaheʻe, a laila i nā mea hou e hiki mai ana e ʻike ʻoe i kēlā me kēia manawa he liʻiliʻi a liʻiliʻi hoʻi nā hopena wahaheʻe e pili ana i kāu codebase.

Ma hope o ka hoʻohui

No laila ua hele mākou i nā pae āpau o ka hoʻohui ʻana i ka loiloi static i ke kaʻina hoʻomohala. ʻOiai ke koʻikoʻi o ka hoʻonohonoho ʻana i ia mau mea hana ma CI, ʻo ka wahi koʻikoʻi e holo ai lākou ʻo ka kamepiula o ka mea hoʻomohala. Ma hope o nā mea a pau, ʻaʻole he luna kānāwai ka static analyzer nāna e ʻōlelo ma kahi mamao aku iā ʻoe ʻaʻole maikaʻi ke code. ʻO ka mea ʻē aʻe, he mea kōkua ia e haʻi iā ʻoe inā luhi ʻoe a hoʻomanaʻo iā ʻoe inā ua poina ʻoe i kekahi mea.

ʻOiaʻiʻo, me ka ʻole o ka hoʻohana maʻamau, ʻaʻole paha e maʻalahi ka hoʻomohala ʻana. Ma hope o nā mea a pau, ʻo kāna pōmaikaʻi nui no ka mea hoʻomohala ʻaʻole i ka nui o ka ʻimi ʻana i nā ʻāpana paʻakikī a hoʻopaʻapaʻa o ke code, akā i ko lākou ʻike mua ʻana. E ʻae ʻo ka ʻike ʻana i kahi pilikia ma hope o ka hoʻouna ʻia ʻana o nā hoʻoponopono no ka hoʻāʻo ʻana ʻaʻole ia he mea leʻaleʻa wale nō, akā hoʻopau manawa. Ke hoʻohana pinepine ʻia, nānā pono i kēlā me kēia loli ma kāu kamepiula a hōʻike i nā wahi kānalua i ka wā e hana ana i ke code.

A inā ʻaʻole maopopo ʻoe a i ʻole kāu mau hoa hana inā pono ke hoʻokō ʻana i ka loiloi, a laila manaʻo wau e hoʻomaka ʻoe e heluhelu i ka ʻatikala "ʻO nā kumu e hoʻokomo ai i ka mea hoʻopuka helu static PVS-Studio i loko o ke kaʻina hana". Ke kamaʻilio nei ia i nā hopohopo maʻamau o nā mea hoʻomohala e hoʻopau i ka loiloi static i ko lākou manawa a pēlā aku.

Ka nānā 'ana i ka static - mai ka hoʻomaka a hiki i ka hoʻohui

Inā makemake ʻoe e kaʻana like i kēia ʻatikala me kahi anaina ʻōlelo Pelekania, e ʻoluʻolu e hoʻohana i ka loulou unuhi: Maxim Zvyagintsev. ʻIkepili Static: Mai ka hoʻomaka ʻana a hiki i ka hoʻohui ʻana.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka