Pehea e hoʻokō ai i kahi loiloi code static i kahi papahana hoʻoilina me ka hoʻohaʻahaʻa ʻole i ka hui

Pehea e hoʻokō ai i kahi loiloi code static i kahi papahana hoʻoilina me ka hoʻohaʻahaʻa ʻole i ka hui
He mea maʻalahi ka hoʻāʻo ʻana i kahi helu helu helu static. Akā no ka hoʻokō ʻana, ʻoi loa i ka hoʻomohala ʻana i kahi papahana kahiko nui, pono ke akamai. Inā hana hewa ʻole, hiki i ka mea loiloi ke hoʻohui i ka hana, hoʻolohi i ka hoʻomohala ʻana, a hoʻohaʻahaʻa i ka hui. E kamaʻilio pōkole e pili ana i ke ʻano e hoʻokokoke pono ai i ka hoʻohui ʻana o ka loiloi static i ke kaʻina hoʻomohala a hoʻomaka e hoʻohana iā ia ma ke ʻano he ʻāpana o CI/CD.

Hōʻike

I kēia mau lā, ua huki ʻia koʻu manaʻo i ka hoʻolaha "E hoʻomaka me ka Static Analysis me ka ʻole o ka hoʻoluhi ʻana i ka hui". Ma kekahi ʻaoʻao, he ʻatikala maikaʻi kēia i kūpono e ʻike. 'Ōlelo mai ka ʻatikala hiki iā ʻoe ke ʻae i ka ʻaiʻē ʻenehana a hana wale i ke code hou, akā ʻaʻohe pane i ka mea e hana ai me kēia aie ʻenehana ma hope.

Hāʻawi kā mākou hui PVS-Studio i kāna ʻike ma kēia kumuhana. E nānā kākou i ke ʻano o ka pilikia o ka hoʻokō ʻana i ka helu helu helu static ma kahi mua, pehea e lanakila ai i kēia pilikia, a pehea e hoʻopau mālie ai i ka ʻaiʻē ʻenehana.

Nā pilikia

ʻAʻole paʻakikī ka hoʻomaka ʻana a ʻike i ke ʻano o ka hana ʻana o kahi mea hoʻoponopono static [1]. Hiki iā ʻoe ke ʻike i nā hewa hoihoi a i ʻole nā ​​​​pilikia weliweli i ke code. Hiki iā ʻoe ke hoʻoponopono i kekahi mea, akā haʻalele ka nui o nā mea polokalamu.

Hoʻopuka nā mea loiloi static a pau i nā hopena maikaʻi ʻole. He hiʻohiʻona kēia o ke ʻano loiloi code static, a ʻaʻohe mea hiki ke hana ʻia. Ma ka hihia maʻamau, he pilikia hiki ʻole ke hoʻonā ʻia kēia, e like me ka mea i hōʻoia ʻia e ka theorem a Rice [2]. ʻAʻole kōkua nā algorithm aʻo mīkini [3]. ʻOiai inā ʻaʻole hiki i ke kanaka ke haʻi mau inā he hewa kēia a i ʻole kēlā code, a laila ʻaʻole pono ʻoe e manaʻo i kēia mai ka papahana :).

ʻAʻole pilikia nā hoʻopunipuni hoʻopunipuni inā ua hoʻonohonoho mua ʻia ka mea hoʻoponopono static:

  • Hoʻopau i nā hoʻonohonoho kānāwai pili ʻole;
  • Ua hoʻopau ʻia kekahi mau diagnostics pili ʻole;
  • Inā mākou e kamaʻilio e pili ana iā C a i ʻole C ++, a laila hoʻopaʻa ʻia nā macros i loaʻa nā hana kikoʻī e hōʻike ʻia ai nā ʻōlelo aʻo pono ʻole ma nā wahi a pau e hoʻohana ʻia ai nā macros;
  • Hōʻailona ʻia nā hana ponoʻī e hana i nā hana e like me nā hana ʻōnaehana (kona analogue memcpy ai ole ia, paʻi) [4];
  • Hoʻopau ʻia nā ʻōlelo maikaʻi ʻole me ka hoʻohana ʻana i nā manaʻo;
  • A pela aku.

I kēia hihia, hiki iā mākou ke manaʻo i kahi haʻahaʻa haʻahaʻa haʻahaʻa haʻahaʻa ma kahi o 10-15% [5]. Ma nā huaʻōlelo ʻē aʻe, ʻo 9 o 10 mau ʻōlelo aʻoaʻo e hōʻike ana i kahi pilikia maoli i ka code, a i ʻole ka liʻiliʻi loa "code ʻala ikaika." E ʻae, ʻoluʻolu loa kēia hiʻohiʻona, a he hoaaloha maoli ka mea hoʻoponopono.

Pehea e hoʻokō ai i kahi loiloi code static i kahi papahana hoʻoilina me ka hoʻohaʻahaʻa ʻole i ka hui
ʻO kaʻoiaʻiʻo, ma kahi papahana nui, eʻokoʻa loa ke kiʻi mua. Hoʻopuka ka mea loiloi i nā haneli a i ʻole mau tausani o nā ʻōlelo aʻo no ke code hoʻoilina. ʻAʻole hiki ke hoʻomaopopo koke i kahi o kēia mau ʻōlelo aʻo e pili ana a ʻaʻole pono. He mea noʻonoʻo ke noho i lalo a hoʻomaka i ka hana ʻana i kēia mau ʻōlelo aʻo a pau, no ka mea, e pau ka hana nui i kēia hihia no nā lā a i ʻole pule. ʻO ka maʻamau, ʻaʻole hiki i kahi hui ke kūʻai i kēlā ʻano hiʻohiʻona. E nui nō hoʻi nā diffs e hōʻino i ka mōʻaukala hoʻololi. A ʻo ka hoʻoponopono wikiwiki ʻana i nā ʻāpana he nui i loko o ke code e hopena i nā typos hou a me nā hewa.

A ʻo ka mea nui loa, ʻo ia ʻano hana i ka hakakā ʻana i nā ʻōlelo aʻo he mea liʻiliʻi. E ʻae mai ka holo pono ʻana o ka papahana no nā makahiki he nui, ua hoʻoponopono ʻia ka hapa nui o nā hewa koʻikoʻi i loko. ʻAe, he kumukūʻai nui kēia mau hoʻoponopono, pono e hoʻopau ʻia, loaʻa nā manaʻo hoʻohana maikaʻi ʻole e pili ana i nā pōpoki, a pēlā aku. E kōkua ana ka mea anaana static e hoʻoponopono i ka nui o kēia mau hewa i ka pae coding, wikiwiki a maʻalahi. Akā i kēia manawa, hoʻokahi ala a i ʻole kekahi, ua hoʻoponopono ʻia kēia mau hewa, a ʻike nui ka mea anana i nā hewa koʻikoʻi ʻole i ka code kahiko. ʻAʻole hiki ke hoʻohana ʻia kēia code, hiki ke hoʻohana ʻole ʻia, a ʻaʻole i alakaʻi ka hewa i nā hopena ʻike. Malia paha ma kahi o ke aka mai ka pihi ke kala hewa, akā ʻaʻole ia e hoʻopilikia i ka hoʻohana ʻana o kekahi i ka huahana.

ʻOiaʻiʻo, ʻo nā hewa liʻiliʻi he mau hewa. A i kekahi manawa hiki i kahi kuhi ke hūnā i kahi nāwaliwali maoli. Eia naʻe, ʻo ka hāʻawi ʻana i nā mea āpau a me ka hoʻolilo ʻana i nā lā / pule e pili ana i nā hemahema i hōʻike ʻole ʻia e like me kahi manaʻo kānalua.

Nānā nā polokalamu polokalamu, nānā, nānā i kēia mau ʻōlelo aʻo a pau e pili ana i ka code hana kahiko ... A manaʻo lākou: hiki iā mākou ke hana me ka ʻole o ka nānā ʻana. E hele kāua e kākau i kekahi mau hana pono hou.

Ma ko lākou ʻano ponoʻī, pololei lākou. Manaʻo lākou he mea mua lākou e hoʻopau i kēia mau ʻōlelo luhi. Ma laila wale nō e loaʻa ai iā lākou ka pōmaikaʻi mai ka hoʻohana mau ʻana i ka code analyzer. Inā ʻaʻole, e hāʻule wale nā ​​ʻōlelo aʻo hou i nā mea kahiko, ʻaʻohe mea e hoʻolohe iā lākou.

ʻO kēia ka hoʻohālikelike like me nā ʻōlelo aʻoaʻo compiler. ʻAʻole ia he kumu ʻole ko lākou paipai ʻana e mālama i ka helu o nā ʻōlelo aʻoaʻo ma ka 0. Inā he 1000 mau ʻōlelo aʻo, a laila i ka wā he 1001, ʻaʻohe mea nāna e hoʻolohe, ʻaʻole maopopo kahi e ʻimi ai i kēia ʻōlelo aʻo hou.

Pehea e hoʻokō ai i kahi loiloi code static i kahi papahana hoʻoilina me ka hoʻohaʻahaʻa ʻole i ka hui
ʻO ka mea pōʻino loa i kēia moʻolelo, ʻo ia ke koi ʻia ʻoe e kekahi mai luna mai i kēia manawa e hoʻohana i ka loiloi code static. E hoʻohaʻahaʻa wale kēia i ka hui, no ka mea, mai ko lākou manaʻo e loaʻa hou ka paʻakikī bureaucratic e hele wale i ke ala. ʻAʻohe mea e nānā i nā hōʻike a ka mea hoʻoponopono, a ʻo ka hoʻohana ʻana a pau e "ma ka pepa". ʻO kēlā mau mea. ʻO ka maʻamau, kūkulu ʻia ka loiloi i loko o ke kaʻina DevOps, akā i ka hoʻomaʻamaʻa ʻaʻole pono kēia i kekahi. Ua lohe mākou i nā moʻolelo kikoʻī ma nā hale kūʻai mai ka poʻe i hele i ka ʻaha kūkā. Hiki i ia ʻike ke hoʻonāwaliwali i ka poʻe programmer mai ka hoʻohana ʻana i nā mea hana loiloi static no ka manawa lōʻihi, inā ʻaʻole mau loa.

Hoʻokō a hoʻopau i ka ʻaiʻē ʻenehana

ʻO ka ʻoiaʻiʻo, ʻaʻohe mea paʻakikī a makaʻu paha e pili ana i ka hoʻokomo ʻana i ka loiloi static a hiki i kahi papahana kahiko nui.

CI / CD

Eia kekahi, hiki ke hana koke i ka mea anaana i ke kaʻina hana hoʻomohala mau. No ka laʻana, aia ka PVS-Studio i nā pono no ka nānā pono ʻana i ka hōʻike ma ke ʻano āu e pono ai, a me nā hoʻolaha i nā mea hoʻomohala i kākau i nā ʻāpana pilikia o ke code. No ka poʻe makemake nui i ka hoʻokuʻu ʻana i ka PVS-Studio mai nā ʻōnaehana CI / CD, paipai wau e hoʻomaʻamaʻa ʻoe iā ʻoe iho me nā mea pili. pauku nā palapala a me nā ʻatikala:

Akā, e hoʻi kākou i ka hoʻopuka ʻana o ka nui o nā mea maikaʻi ʻole i nā pae mua o ka hoʻokō ʻana i nā mea hana loiloi code.

Hoʻoponopono i ka ʻaiʻē ʻenehana i kēia manawa a me ka hoʻoponopono ʻana i nā ʻōlelo aʻo hou

Hiki iā ʻoe ke aʻo i nā ʻōlelo aʻo hou i ʻike ʻia ma nā code hou a i ʻole nā ​​​​mea i hoʻololi ʻia. ʻOkoʻa ka hoʻokō ʻana o kēia ʻano hana, akā ʻo ke ʻano like. Ma ka PVS-Studio static analyzer, ua hoʻokō ʻia kēia hana penei.

No ka hoʻomaka koke ʻana i ka hoʻohana ʻana i ka loiloi static, manaʻo mākou i nā mea hoʻohana PVS-Studio e hoʻohana i ka mīkini no ka hoʻopau nui ʻana i nā ʻōlelo aʻo.6]. Eia ka manao nui. Ua hoʻokuʻu ka mea hoʻohana i ka loiloi a loaʻa nā ʻōlelo aʻo he nui. ʻOiai ke ola nei kahi papahana i kūkulu ʻia no nā makahiki he nui, e hoʻomohala ana a loaʻa kālā, a laila ʻaʻole nui nā ʻōlelo aʻo i loko o ka hōʻike e hōʻike ana i nā hemahema koʻikoʻi. I nā huaʻōlelo ʻē aʻe, ua hoʻoponopono ʻia nā pōpoki koʻikoʻi i kekahi ala a i ʻole me ka hoʻohana ʻana i nā ala ʻoi aku ka maikaʻi a i ʻole mahalo i ka manaʻo mai nā mea kūʻai aku. No laila, hiki ke noʻonoʻo ʻia nā mea a pau i ʻike ʻia e ka mea anamanaʻo i kēia manawa, ʻaʻole hiki ke hoʻāʻo e hoʻopau koke.

Hiki iā ʻoe ke haʻi iā PVS-Studio e noʻonoʻo i kēia mau ʻōlelo aʻo i pili ʻole i kēia manawa (e mālama i ka aie ʻenehana no hope), a ʻaʻole ia e hōʻike hou iā lākou. Hoʻokumu ka mea hōʻike i kahi faila kūikawā kahi e mālama ai i ka ʻike e pili ana i nā hewa ʻaʻole hoihoi. A i kēia manawa e hoʻopuka ʻo PVS-Studio i nā ʻōlelo luhi wale nō no ka code hou a i hoʻololi ʻia paha. Eia kekahi, ua hoʻokō ʻia kēia mau mea me ke akamai. Inā, no ka laʻana, ua hoʻohui ʻia kahi laina hakahaka i ka hoʻomaka ʻana o ka faila code source, a laila maopopo ka mea ananely, ʻoiaʻiʻo, ʻaʻohe mea i loli, a e hoʻomau ʻia e noho mālie. Hiki ke hoʻokomo ʻia kēia faila markup i kahi ʻōnaehana mana mana. Nui ka faila, akā ʻaʻole pilikia kēia, no ka mea ʻaʻohe kumu o ka mālama pinepine ʻana.

I kēia manawa, e ʻike nā mea papahana a pau i nā ʻōlelo luhi e pili ana i nā code hou a i hoʻololi ʻia paha. No laila, hiki iā ʻoe ke hoʻomaka i ka hoʻohana ʻana i ka analyzer, e like me kā lākou e ʻōlelo ai, mai ka lā aʻe. A hiki iā ʻoe ke hoʻi i ka hōʻaiʻē ʻenehana ma hope, a hoʻoponopono mālie i nā hewa a hoʻonohonoho i ka analyzer.

No laila, ua hoʻoholo ʻia ka pilikia mua me ka hoʻokō ʻana o ka mea anana i kahi papahana kahiko nui. I kēia manawa e noʻonoʻo kākou i ka mea e hana ai me ka ʻaiʻē loea.

Hoʻoponopono ʻino a me refactorings

ʻO ka mea maʻalahi a maʻamau ka hoʻokaʻawale ʻana i kekahi manawa no ka nānā ʻana i nā ʻōlelo aʻoaʻo analyser i kāohi nui ʻia a hana mālie me lākou. Ma kahi e pono ai ʻoe e hoʻoponopono i nā hewa i ke code, ma kahi e pono ai ʻoe e refactor e haʻi i ka mea loiloi ʻaʻole pilikia ke code. Laʻana maʻalahi:

if (a = b)

Hoʻopiʻi ka hapa nui o nā mea hōʻuluʻulu C ++ a me nā mea loiloi e pili ana i ia code, no ka mea aia ke kiʻekiʻe o ko lākou makemake maoli e kākau (a == b). Akā, aia kahi ʻaelike i ʻōlelo ʻole ʻia, a ʻike pinepine ʻia kēia i loko o ka palapala, inā he mau pale hou, a laila manaʻo ʻia ua kākau ʻia e ka programmer ia code, a ʻaʻohe pono e hoʻohiki. No ka laʻana, i ka palapala PVS-Studio no ka diagnostics V559 (CWE-481) ua kakau maopopo ia keia laina e manaoia he pololei a palekana.

if ((a = b))

ʻO kekahi laʻana. Ua poina anei ia ma kēia code C++? wanaao ae ʻaʻole paha?

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

E hoʻopuka ka mea hōʻike PVS-Studio i kahi ʻōlelo aʻo ma aneʻi V796 (CWE-484). ʻAʻole paha kēia he hewa, a laila pono ʻoe e hāʻawi i ka parser i kahi hōʻailona ma ka hoʻohui ʻana i ke ʻano [[ hāʻule ]] a i ʻole he laʻana __ʻano__((fallthrough)):

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

Hiki ke ʻōlelo ʻia ʻaʻole e hoʻoponopono kēlā mau hoʻololi code i ka bug. ʻAe, he ʻoiaʻiʻo kēia, akā hana ʻelua mau mea pono. ʻO ka mea mua, hoʻopau ka hōʻike analyer i nā hopena maikaʻi ʻole. ʻO ka lua, ʻoi aku ka maʻalahi o ke code no ka poʻe i komo i kāna mālama. A he mea nui loa kēia! No kēia wale nō, pono e hana i nā refactorings liʻiliʻi e hoʻomaʻamaʻa a maʻalahi hoʻi ka mālama ʻana i ke code. No ka mea ʻaʻole maopopo i ka mea loiloi inā pono ka "break" a ʻaʻole paha, ʻaʻole maopopo ia i nā hoa polokalamu.

Ma kahi o ka hoʻoponopono ʻana i ka bug a me ka refactorings, hiki iā ʻoe ke kāohi pono i nā ʻōlelo aʻoaʻo hoʻopunipuni. Hiki ke hoʻopau ʻia kekahi mau diagnostics pili ʻole. No ka laʻana, manaʻo kekahi he mea ʻole ka ʻōlelo aʻo V550 e pili ana i ka hoʻohālikelike ʻana i nā waiwai lana/pālua. A hoʻokaʻawale kekahi iā lākou he mea nui a kūpono hoʻi e aʻo ʻia [7]. ʻO nā ʻōlelo aʻo i manaʻo ʻia he kūpono a ʻaʻole ia i ka hui hoʻomohala e hoʻoholo.

Aia kekahi mau ala ʻē aʻe e hoʻopau ai i nā leka hoʻopunipuni. No ka laʻana, ua ʻōlelo mua ʻia ka māka macro. ʻO kēia mau mea a pau i wehewehe ʻia ma ka palapala. ʻO ka mea nui loa, ʻo ka hoʻomaopopo ʻana inā ʻoe e hoʻokokoke mālie a me ka systematically e hana me nā hopena hoʻopunipuni, ʻaʻohe hewa iā lākou. ʻO ka hapa nui o nā ʻōlelo aʻo hoihoi ʻole e nalowale ma hope o ka hoʻonohonoho ʻana, a ʻo nā wahi wale nō e koi pono i ka noʻonoʻo pono a me kekahi mau hoʻololi i ke code e koe.

Eia kekahi, kōkua mau mākou i kā mākou mea kūʻai aku e hoʻonohonoho i ka PVS-Studio inā loaʻa kekahi pilikia. Eia kekahi, aia kekahi mau hihia i hoʻopau mākou iā mākou iho i nā ʻōlelo aʻo wahaheʻe a hoʻoponopono i nā hewa [8]. ʻO ka hihia wale nō, ua hoʻoholo wau e haʻi i kēia koho no ka hui lōʻihi hiki nō hoʻi :).

ʻO ke ʻano Ratchet

Aia kekahi ala hoihoi e hoʻomaikaʻi mālie i ka maikaʻi code ma ka hoʻopau ʻana i ka ʻōlelo aʻoaʻo static analyzer. ʻO ka laina lalo, hiki ke emi wale ka helu o nā ʻōlelo aʻo.

Pehea e hoʻokō ai i kahi loiloi code static i kahi papahana hoʻoilina me ka hoʻohaʻahaʻa ʻole i ka hui

Hoʻopaʻa ʻia ka helu o nā ʻōlelo aʻo i hoʻopuka ʻia e ka mea hoʻoponopono static. Hoʻonohonoho ʻia ka ʻīpuka maikaʻi i kēia manawa hiki iā ʻoe ke komo i kahi code ʻaʻole e hoʻonui i ka nui o nā hana. ʻO ka hopena, hoʻomaka ke kaʻina hana o ka hoʻohaʻahaʻa haʻahaʻa ʻana i ka helu o nā alarms ma ka hoʻoponopono ʻana i ka mea anana a me ka hoʻoponopono ʻana i nā hewa.

ʻOiai inā makemake ke kanaka e hoʻopunipuni liʻiliʻi a hoʻoholo e hele i ka ʻīpuka maikaʻi ʻaʻole ma ka hoʻopau ʻana i nā ʻōlelo aʻo i kāna code hou, akā ma ka hoʻomaikaʻi ʻana i ke code ʻaoʻao kahiko, ʻaʻole ia he mea weliweli. Hoʻokahi like, huli ka ratchet i hoʻokahi ʻaoʻao, a e emi mālie ka helu o nā hemahema. ʻOiai inā ʻaʻole makemake ke kanaka e hoʻoponopono i kāna mau hemahema hou, pono ʻo ia e hoʻomaikaʻi i kekahi mea ma ke code e pili ana. I kekahi manawa, pau nā ala maʻalahi e hōʻemi i ka helu o nā ʻōlelo aʻo, a hiki mai kahi manawa e hoʻoponopono ʻia ai nā pōpoki maoli.

Ua wehewehe ʻia kēia ʻano hana i nā kikoʻī hou aku i kahi ʻatikala hoihoi loa e Ivan Ponomarev "E hoʻokō i ka loiloi static i ke kaʻina hana, ma mua o ka hoʻohana ʻana iā ia e ʻimi ai i nā pōpoki", aʻu e paipai nei e heluhelu i ka poʻe makemake e hoʻomaikaʻi i ka maikaʻi code.

He hōʻike pū ka mea kākau o ka ʻatikala e pili ana i kēia kumuhana: "Ke kālailai kūmau mau".

hopena

Manaʻo wau ma hope o kēia ʻatikala, e ʻae ʻia ka poʻe heluhelu i nā mea hana loiloi static a makemake lākou e hoʻokō iā lākou i ke kaʻina hana. Inā he mau nīnau kāu, mākaukau mau mākou aʻo nā mea hoʻohana o kā mākou static analyzer PVS-Studio a kōkua me kāna hoʻokō.

Aia kekahi mau kānalua maʻamau e pili ana inā hiki ke maʻalahi a me ka pono o ka loiloi static. Ua ho'āʻo wau e hoʻopau i ka hapa nui o kēia mau kānalua i ka paʻi "Nā kumu e hoʻokomo i ka PVS-Studio static code analyzer i loko o ke kaʻina hana" [9].

Mahalo no kou noonoo a hele mai скачать a ho'āʻo i ka PVS-Studio analyzer.

Nā loulou hou aku

  1. Andrey Karpov. Pehea e hiki ai iaʻu ke ʻike koke i nā ʻōlelo aʻo hoihoi a ka PVS-Studio analyzer i hana no ka code C a me C++?
  2. ʻO Wikipedia. Ka manaʻo o ka laiki.
  3. Andrey Karpov, Victoria Khanieva. Ke hoʻohana nei i ke aʻo ʻana i ka mīkini i ka nānā ʻana i nā kumu kumu papahana.
  4. PVS-Studio. Palapala. Nā hoʻonohonoho diagnostic hou.
  5. Andrey Karpov. ʻO nā hiʻohiʻona o ka PVS-Studio analyzer me ka hoʻohana ʻana i ka laʻana o EFL Core Libraries, 10-15% false positives.
  6. PVS-Studio. Palapala. Kāohi nui ʻana i nā memo analyer.
  7. ʻO Ivan Andryashin. E pili ana i ke ʻano o kā mākou hoʻāʻo ʻana i ka loiloi static ma kā mākou papahana o kahi simulator hoʻonaʻauao o ka ʻoki endovascular X-ray.
  8. Pavel Eremeev, Svyatoslav Razmyslov. Pehea i hoʻomaikaʻi ai ka hui PVS-Studio i ke code Unreal Engine.
  9. Andrey Karpov. ʻO nā kumu e hoʻokomo ai i ka mea hoʻopuka helu static PVS-Studio i loko o ke kaʻina hana.

Pehea e hoʻokō ai i kahi loiloi code static i kahi papahana hoʻoilina me ka hoʻohaʻahaʻa ʻole i ka hui

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: Andrey Karpov. Pehea e hoʻokomo ai i kahi helu helu helu static i kahi papahana hoʻoilina a ʻaʻole e hoʻonāwaliwali i ka hui.

Source: www.habr.com

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