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.
ʻ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:
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):
ʻ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):
ʻ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:
PVS-Studio_Cmd.exe (ka nānā ʻana o nā hoʻonā, nā papahana C#, C++ ma Windows)
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:
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:
ʻ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.
ʻ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:
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.
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:
ʻ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:
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.