Yuav ua li cas siv tus lej ntsuas tus lej zoo li qub hauv txoj haujlwm qub txeeg qub teg yam tsis muaj kev txhawb nqa pab pawg

Yuav ua li cas siv tus lej ntsuas tus lej zoo li qub hauv txoj haujlwm qub txeeg qub teg yam tsis muaj kev txhawb nqa pab pawg
Nws yog ib qho yooj yim mus sim ib tug zoo li qub code analyzer. Tab sis los siv nws, tshwj xeeb tshaj yog nyob rau hauv txoj kev loj hlob ntawm ib qhov project qub, yuav tsum muaj kev txawj ntse. Yog tias ua tsis raug, tus kws tshuaj ntsuam xyuas tuaj yeem ntxiv kev ua haujlwm, qeeb kev txhim kho, thiab ua rau pab pawg. Cia peb tham luv luv txog yuav ua li cas kom zoo rau kev sib koom ua ke ntawm kev txheeb xyuas zoo li qub rau hauv txoj kev txhim kho thiab pib siv nws ua ib feem ntawm CI / CD.

Taw qhia

Tsis ntev los no kuv tau mloog mus rau kev tshaj tawm "Pib Nrog Kev Ntsuam Xyuas Static Tsis Txaus Siab Pab Pawg". Ntawm ib sab, qhov no yog ib tsab xov xwm zoo uas tsim nyog tau txais kev paub nrog. Ntawm qhov tod tes, nws zoo nkaus li kuv tias nws tseem tsis tau muab cov lus teb ua tiav ntawm yuav ua li cas tsis siv tshuaj zoo li qub hauv ib qhov project nrog ntau. Tsab xov xwm hais tias Koj tuaj yeem lees txais cov nuj nqis thev naus laus zis thiab ua haujlwm tsuas yog ntawm cov cai tshiab, tab sis tsis muaj lus teb rau yuav ua li cas nrog cov nuj nqis no tom qab.

Peb pab pawg PVS-Studio muab nws qhov kev pom ntawm lub ncauj lus no. Cia peb saib yuav ua li cas qhov teeb meem ntawm kev siv tus lej ntsuas qhov zoo li qub tshwm sim hauv thawj qhov chaw, yuav ua li cas kov yeej qhov teeb meem no, thiab yuav ua li cas kom tsis txhob mob maj mam tshem tawm cov nuj nqis.

Teeb meem

Nws yog feem ntau tsis yooj yim rau kev tso tawm thiab saib seb lub ntsuas hluav taws xob zoo li cas [1]. Koj tuaj yeem pom qhov tsis txaus ntseeg lossis txawm tias txaus ntshai muaj peev xwm ua rau muaj qhov tsis zoo hauv cov cai. Koj tuaj yeem kho qee yam, tab sis tom qab ntawd ntau tus programmers tso tseg.

Tag nrho cov static analyzers tsim qhov tsis zoo. Qhov no yog qhov tshwj xeeb ntawm cov txheej txheem kev tshuaj xyuas zoo li qub, thiab tsis muaj dab tsi tuaj yeem ua tau txog nws. Hauv qhov xwm txheej dav dav, qhov no yog qhov teeb meem tsis tuaj yeem daws tau, raws li kev lees paub los ntawm Rice's theorem [2]. Kev kawm tshuab algorithms yuav tsis pab yog [3]. Txawm hais tias ib tug neeg tsis tuaj yeem qhia tau tias qhov no lossis qhov chaws ntawd tsis raug, ces koj yuav tsum tsis txhob cia siab tias qhov no los ntawm qhov program :).

False positives tsis yog ib qho teeb meem yog hais tias tus static analyzer twb configured:

  • Cov neeg xiam oob qhab tsis cuam tshuam cov cai;
  • Qee qhov kev kuaj mob tsis cuam tshuam tau raug kaw;
  • Yog tias peb tab tom tham txog C lossis C ++, ces macros tau cim tias muaj cov kev tsim tshwj xeeb uas ua rau muaj kev ceeb toom tsis zoo tshwm sim hauv txhua qhov chaw uas siv macros;
  • Tus kheej lub luag haujlwm raug cim tias ua haujlwm zoo ib yam li cov haujlwm ua haujlwm (nws tus kheej analogue memcpy los yog printf) [4];
  • Cov lus tsis tseeb yog tshwj xeeb tsis siv neeg siv cov lus pom;
  • Thiab yog li ntawd.

Nyob rau hauv cov ntaub ntawv no, peb tuaj yeem cia siab tias qhov tsis zoo tsis zoo ntawm kwv yees li 10-15% [5]. Hauv lwm lo lus, 9 tawm ntawm 10 cov lus ceeb toom ntsuas yuav qhia txog qhov teeb meem tiag tiag hauv cov cai, lossis tsawg kawg "cov lej muaj zog." Pom zoo, qhov xwm txheej no zoo siab heev, thiab tus kws tshuaj ntsuam xyuas yog tus phooj ywg tiag tiag ntawm tus programmer.

Yuav ua li cas siv tus lej ntsuas tus lej zoo li qub hauv txoj haujlwm qub txeeg qub teg yam tsis muaj kev txhawb nqa pab pawg
Nyob rau hauv kev muaj tiag, nyob rau hauv ib qhov project loj, thawj daim duab yuav txawv kiag li. Cov kws tshuaj ntsuam xyuas tshaj tawm ntau pua lossis ntau txhiab tus lus ceeb toom rau cov cai qub. Nws yog tsis yooj yim sua kom nkag siab sai sai uas cov lus ceeb toom no cuam tshuam thiab qhov twg tsis yog. Nws yog qhov tsis tsim nyog los zaum thiab pib cuam tshuam nrog tag nrho cov lus ceeb toom no, txij li cov haujlwm tseem ceeb hauv qhov no yuav nres rau hnub lossis ntau lub lis piam. Feem ntau, ib pab neeg tsis tuaj yeem them taus qhov xwm txheej zoo li no. Kuj tseem yuav muaj ntau qhov sib txawv uas cuam tshuam txog keeb kwm kev hloov pauv. Thiab kev kho kom ceev ceev ntawm ntau qhov tawg hauv cov cai yuav ua rau muaj kev hloov pauv tshiab thiab tsis raug.

Thiab qhov tseem ceeb tshaj, xws li kev sib ntaus sib tua tiv thaiv kev ceeb toom ua rau muaj kev nkag siab me ntsis. Pom zoo tias txij li qhov project tau ua tiav tau ntau xyoo, feem ntau ntawm cov teeb meem tseem ceeb hauv nws twb raug kho lawm. Yog lawm, cov kev kho no kim heev, yuav tsum tau debugged, tau txais cov lus tsis zoo rau cov neeg siv cov lus qhia txog kab, thiab lwm yam. Tus kws tshuaj ntsuam xyuas zoo li qub yuav pab kho ntau qhov tsis raug ntawm theem coding, sai thiab pheej yig. Tab sis tam sim no, ib txoj hauv kev los yog lwm qhov, cov kev ua yuam kev no tau raug kho, thiab cov neeg soj ntsuam feem ntau pom qhov tsis tseem ceeb hauv cov cai qub. Cov cai no yuav tsis raug siv, nws yuav raug siv tsawg heev, thiab qhov yuam kev hauv nws yuav tsis ua rau pom qhov tshwm sim. Tej zaum qhov chaw ntxoov ntxoo ntawm lub pob yog xim tsis ncaj ncees lawm, tab sis qhov no tsis cuam tshuam rau leej twg siv cov khoom.

Tau kawg, txawm me me yuam kev tseem ua yuam kev. Thiab qee zaum qhov yuam kev tuaj yeem zais qhov muaj qhov tsis zoo tiag tiag. Txawm li cas los xij, muab txhua yam thiab siv hnub / lub lis piam los daws cov teeb meem uas tsis tshua pom lawv tus kheej zoo li lub tswv yim tsis zoo.

Cov programmers saib, saib, saib tag nrho cov lus ceeb toom no txog cov haujlwm qub ... Thiab lawv xav tias: peb tuaj yeem ua yam tsis muaj kev tshuaj xyuas zoo li qub. Wb mus sau ib co tshiab muaj txiaj ntsig functionality.

Ntawm lawv tus kheej, lawv yog txoj cai. Lawv xav tias thawj zaug lawv yuav tsum tau tshem tawm tag nrho cov lus ceeb toom no. Tsuas yog tom qab ntawd lawv yuav muaj peev xwm tau txais txiaj ntsig los ntawm kev siv tus lej ntsuas ntsuas. Txwv tsis pub, cov lus ceeb toom tshiab tsuas yog poob rau hauv cov laus, thiab tsis muaj leej twg yuav mloog lawv.

Qhov no yog ib qho piv txwv zoo ib yam li cov lus ceeb toom compiler. Nws tsis yog tsis muaj laj thawj uas lawv pom zoo kom khaws cov lus ceeb toom ntawm 0. Yog tias muaj 1000 cov lus ceeb toom, ces thaum muaj 1001, tsis muaj leej twg yuav mloog nws, thiab nws tsis paub meej qhov twg los nrhiav qhov kev ceeb toom tshiab tshaj plaws no.

Yuav ua li cas siv tus lej ntsuas tus lej zoo li qub hauv txoj haujlwm qub txeeg qub teg yam tsis muaj kev txhawb nqa pab pawg
Qhov phem tshaj plaws nyob rau hauv zaj dab neeg no yog tias ib tug neeg los ntawm saum toj no lub sij hawm yuam kom koj siv static code tsom xam. Qhov no tsuas yog demotivate pab pawg, txij li los ntawm lawv qhov kev xav yuav muaj qhov nyuaj ntxiv uas tsuas yog tau txais txoj hauv kev. Tsis muaj leej twg yuav saib tus kws tshuaj ntsuam xyuas cov ntaub ntawv, thiab txhua qhov kev siv yuav tsuas yog "ntawm daim ntawv". Cov. Raws li txoj cai, kev tshuaj xyuas yog tsim rau hauv DevOps txheej txheem, tab sis hauv kev xyaum, qhov no tsis muaj txiaj ntsig rau leej twg. Peb tau hnov ​​​​cov dab neeg ntxaws ntawm lub rooj muag khoom los ntawm cov neeg tuaj koom lub rooj sib tham. Cov kev paub zoo li no tuaj yeem cuam tshuam cov programmer los ntawm kev siv cov cuab yeej tshuaj ntsuam zoo li qub rau lub sijhawm ntev, yog tias tsis tas mus li.

Kev siv thiab tshem tawm cov nuj nqis technical

Qhov tseeb, tsis muaj dab tsi nyuaj lossis txaus ntshai txog kev qhia txog kev txheeb xyuas zoo li qub txawm tias mus rau qhov project qub.

CI / CD

Ntxiv mus, lub analyzer tuaj yeem ua ib feem ntawm txoj kev txhim kho txuas ntxiv tam sim ntawd. Piv txwv li, PVS-Studio faib muaj cov khoom siv rau kev yooj yim saib daim ntawv tshaj tawm hauv hom koj xav tau, thiab cov ntawv ceeb toom rau cov neeg tsim khoom uas tau sau cov teeb meem ntawm cov cai. Rau cov neeg uas xav paub ntau ntxiv txog kev tshaj tawm PVS-Studio los ntawm CI / CD systems, kuv xav kom koj paub koj tus kheej nrog rau qhov sib xws. ntu cov ntaub ntawv thiab ntau cov kab lus:

Tab sis cia peb rov qab mus rau qhov teeb meem ntawm ntau qhov tsis tseeb zoo ntawm thawj theem ntawm kev siv cov cuab yeej tshuaj ntsuam xyuas.

Txhim kho cov nuj nqis uas twb muaj lawm thiab ua raws li cov lus ceeb toom tshiab

Niaj hnub nimno kev lag luam zoo li qub analyzers tso cai rau koj los kawm tsuas yog cov lus ceeb toom tshiab uas tshwm sim hauv cov cai tshiab lossis hloov pauv. Kev siv cov txheej txheem no txawv, tab sis lub ntsiab lus yog tib yam. Hauv PVS-Studio static analyzer, qhov kev ua haujlwm no tau ua raws li hauv qab no.

Txhawm rau sai sai pib siv qhov kev tshuaj ntsuam zoo li qub, peb xav kom cov neeg siv PVS-Studio siv cov txheej txheem rau kev tawm tsam loj ntawm cov lus ceeb toom [6]. Lub tswv yim dav dav yog cov hauv qab no. Tus neeg siv tau pib lub ntsuas ntsuas thiab tau txais ntau yam lus ceeb toom. Txij li thaum ib qhov project uas tau nyob rau hauv txoj kev loj hlob tau ntau xyoo tseem ciaj sia, txhim kho thiab ua tau nyiaj, ces feem ntau yuav tsis muaj ntau cov lus ceeb toom nyob rau hauv tsab ntawv ceeb toom qhia txog qhov tsis xws luag. Hauv lwm lo lus, cov kab mob tseem ceeb twb tau kho ib txoj hauv kev los yog lwm txoj hauv kev siv cov txheej txheem kim dua lossis ua tsaug rau kev tawm tswv yim los ntawm cov neeg siv khoom. Raws li, txhua yam uas tus neeg soj ntsuam pom tam sim no tuaj yeem suav tias yog cov nuj nqis kev lag luam, uas yog qhov tsis zoo los sim tshem tawm tam sim ntawd.

Koj tuaj yeem qhia PVS-Studio kom xav txog cov lus ceeb toom no tsis cuam tshuam rau tam sim no (txuag cov nuj nqis rau tom qab), thiab nws yuav tsis qhia lawv ntxiv lawm. Tus kws tshuaj ntsuam xyuas tsim cov ntaub ntawv tshwj xeeb uas nws khaws cov ntaub ntawv hais txog qhov tsis raug uas tseem tsis tau nthuav tawm. Thiab tam sim no PVS-Studio yuav tshaj tawm cov lus ceeb toom tsuas yog rau tus lej tshiab lossis hloov pauv. Ntxiv mus, tag nrho cov no yog siv cleverly. Yog hais tias, piv txwv li, ib kab khoob tau ntxiv rau qhov pib ntawm cov ntaub ntawv code, ces tus neeg soj ntsuam nkag siab tias, qhov tseeb, tsis muaj dab tsi hloov, thiab yuav nyob twj ywm. Cov ntaub ntawv markup no tuaj yeem muab tso rau hauv qhov kev tswj hwm version. Cov ntaub ntawv loj, tab sis qhov no tsis yog qhov teeb meem, vim tsis muaj qhov taw tes rau kev khaws cia ntau zaus.

Tam sim no txhua tus programmers yuav pom cov lus ceeb toom tsuas yog cuam tshuam rau cov lej tshiab lossis hloov pauv. Yog li, koj tuaj yeem pib siv lub ntsuas ntsuas, raws li lawv hais, txij hnub tom qab. Thiab koj tuaj yeem rov qab mus rau cov nuj nqis technical tom qab, thiab maj mam kho qhov yuam kev thiab teeb tsa lub ntsuas ntsuas.

Yog li ntawd, thawj qhov teeb meem nrog kev siv lub ntsuas ntsuas hauv qhov project qub loj tau raug daws. Tam sim no cia peb xam seb yuav ua li cas nrog cov nuj nqis technical.

Kab laum kho thiab refactorings

Qhov yooj yim tshaj plaws thiab ntuj tshaj plaws yog muab tso tseg qee lub sij hawm los tshuaj xyuas cov lus ceeb toom ntawm cov kws tshuaj ntsuam xyuas thiab maj mam ua nrog lawv. Qee qhov koj yuav tsum kho qhov yuam kev hauv qhov chaws, qhov chaw koj yuav tsum tau rov hais dua los qhia rau tus kws tshuaj ntsuam xyuas tias cov cai tsis muaj teeb meem. Piv txwv yooj yim:

if (a = b)

Feem ntau C ++ compilers thiab cov neeg soj ntsuam yws yws txog cov cai no, vim tias muaj qhov tshwm sim ntau uas lawv xav sau tiag tiag. (a = = b). Tab sis muaj kev pom zoo tsis hais, thiab qhov no feem ntau tau sau tseg hauv cov ntaub ntawv, yog tias muaj cov kab lus ntxiv, ces nws tau txiav txim siab tias tus programmer txhob txwm tshaj tawm cov cai no, thiab tsis tas yuav cog lus. Piv txwv li, hauv PVS-Studio cov ntaub ntawv rau kev kuaj mob V559 (CWE-481) nws tau sau meej meej tias kab hauv qab no yuav raug suav hais tias yog thiab nyab xeeb:

if ((a = b))

Lwm qhov piv txwv. Puas yog nws tsis nco qab hauv C++ code no? so los tsis?

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

PVS-Studio analyzer yuav ceeb toom ntawm no V796 (CWE-484). Qhov no yuav tsis yog qhov yuam kev, nyob rau hauv rooj plaub twg koj yuav tsum muab tus parser ib tug hint los ntawm kev ntxiv tus cwj pwm [[taug kev]] los yog piv txwv __attribute__((fallthrough)):

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

Nws tuaj yeem hais tias qhov kev hloov pauv li no tsis kho cov kab laum. Yog, qhov no yog qhov tseeb, tab sis nws ua ob yam tseem ceeb. Ua ntej, cov ntaub ntawv txheeb xyuas tau tshem tawm qhov tsis zoo. Qhov thib ob, txoj cai tau nkag siab ntau dua rau cov neeg koom nrog hauv nws txoj kev saib xyuas. Thiab qhov no tseem ceeb heev! Rau qhov no ib leeg, nws tsim nyog nqa tawm me me refactorings los ua kom cov cai meej dua thiab yooj yim dua los tswj. Txij li thaum tus kws tshuaj ntsuam tsis nkag siab tias "sab" puas xav tau lossis tsis, nws tseem yuav tsis meej rau cov neeg ua haujlwm programmer.

Ntxiv nrog rau kev txhim kho kab laum thiab refactorings, koj tuaj yeem txwv tsis pub cov lus ceeb toom tsis tseeb. Qee qhov kev kuaj mob tsis tsim nyog tuaj yeem ua tsis taus. Piv txwv li, ib tug neeg xav tias cov lus ceeb toom tsis muaj ntsiab lus V550 hais txog kev sib piv float/double values. Thiab ib txhia faib lawv raws li qhov tseem ceeb thiab tsim nyog kawm [7]. Cov lus ceeb toom twg yog qhov tseem ceeb thiab qhov twg tsis yog nyob ntawm pab pawg txhim kho los txiav txim siab.

Muaj lwm txoj hauv kev los tiv thaiv kev ceeb toom cuav. Piv txwv li, macro markup tau hais ua ntej. Tag nrho cov no tau piav qhia ntau ntxiv hauv cov ntaub ntawv. Qhov tseem ceeb tshaj plaws yog kom nkag siab tias yog tias koj maj mam thiab ua haujlwm ua haujlwm nrog cov lus tsis tseeb, tsis muaj dab tsi tsis ncaj ncees lawm. Feem ntau ntawm cov lus ceeb toom tsis txaus siab ploj mus tom qab kev teeb tsa, thiab tsuas yog qhov chaw uas yuav tsum tau ua tib zoo kawm thiab qee qhov kev hloov pauv hauv cov cai tseem nyob.

Tsis tas li, peb ib txwm pab peb cov neeg siv khoom teeb tsa PVS-Studio yog tias muaj teeb meem tshwm sim. Ntxiv mus, muaj cov xwm txheej thaum peb tus kheej tshem tawm cov lus ceeb toom cuav thiab kho qhov tsis raug [8]. Tsuas yog nyob rau hauv rooj plaub, kuv txiav txim siab hais tias qhov kev xaiv no rau kev koom tes txuas ntxiv kuj tseem ua tau :).

Ratchet txoj kev

Muaj lwm txoj hauv kev nthuav dav kom maj mam txhim kho cov lej zoo los ntawm kev tshem tawm cov lus ceeb toom zoo li qub. Cov kab hauv qab yog tias cov lus ceeb toom tsuas tuaj yeem txo qis.

Yuav ua li cas siv tus lej ntsuas tus lej zoo li qub hauv txoj haujlwm qub txeeg qub teg yam tsis muaj kev txhawb nqa pab pawg

Tus naj npawb ntawm cov lus ceeb toom tawm los ntawm tus ntsuas static yog kaw. Lub rooj vag zoo tau teeb tsa hauv txoj hauv kev uas tam sim no koj tsuas tuaj yeem nkag mus rau tus lej uas tsis ua rau muaj kev ua haujlwm ntau ntxiv. Yog li ntawd, cov txheej txheem ntawm maj mam txo cov xov tooj ntawm lub tswb pib los ntawm kev kho cov ntsuas ntsuas thiab kho qhov yuam kev.

Txawm hais tias ib tug neeg xav dag me ntsis thiab txiav txim siab kom dhau lub rooj vag zoo tsis yog los ntawm kev tshem tawm cov lus ceeb toom hauv nws txoj cai tshiab, tab sis los ntawm kev txhim kho cov txheej txheem qub qub, qhov no tsis txaus ntshai. Tag nrho tib yam, lub ratchet tig nyob rau hauv ib qho kev taw qhia, thiab maj mam tus naj npawb ntawm cov tsis xws luag yuav txo. Txawm hais tias ib tug neeg tsis xav kho nws tus kheej qhov tsis xws luag, nws tseem yuav tau txhim kho qee yam hauv cov cai nyob sib ze. Qee lub sij hawm, txoj hauv kev yooj yim los txo tus naj npawb ntawm cov lus ceeb toom xaus, thiab muaj qhov taw tes thaum cov kab tiag tiag yuav raug kho.

Cov txheej txheem no tau piav qhia ntau ntxiv hauv tsab xov xwm nthuav dav los ntawm Ivan Ponomarev "Ua raws li kev txheeb xyuas zoo li qub rau hauv cov txheej txheem, tsis yog nrhiav cov kab nrog nws", uas kuv pom zoo kom nyeem ntawv rau txhua tus neeg xav tau kev txhim kho cov lej zoo.

Tus sau ntawm tsab xov xwm kuj muaj ib daim ntawv qhia txog lub ntsiab lus no: "Kev tsom xam tsis tu ncua static".

xaus

Kuv vam tias tom qab tsab xov xwm no, cov neeg nyeem yuav tau txais ntau dua ntawm cov cuab yeej tshuaj ntsuam zoo li qub thiab yuav xav siv lawv rau hauv txoj kev txhim kho. Yog tias koj muaj lus nug, peb yeej npaj txhij qhia cov neeg siv ntawm peb cov static analyzer PVS-Studio thiab pab nrog nws cov kev siv.

Muaj lwm yam kev tsis ntseeg txog seb qhov kev soj ntsuam zoo li qub puas tuaj yeem yooj yim thiab muaj txiaj ntsig. Kuv sim tshem tawm feem ntau ntawm cov kev tsis ntseeg no hauv kev tshaj tawm "Yog vim li cas los qhia PVS-Studio static code analyzer rau hauv txoj kev txhim kho" [9].

Ua tsaug rau koj mloog thiab tuaj download thiab sim PVS-Studio analyzer.

Txuas ntxiv

  1. Andrey Karpov. Kuv tuaj yeem pom cov lus ceeb toom nthuav dav li cas uas PVS-Studio analyzer tsim rau C thiab C ++ code?
  2. Wikipedia. Rice lub theorem.
  3. Andrey Karpov, Victoria Khanieva. Siv tshuab kev kawm hauv kev txheeb xyuas zoo li qub ntawm qhov program qhov chaws.
  4. PVS-Studio. Cov ntaub ntawv. Cov chaw kuaj mob ntxiv.
  5. Andrey Karpov. Cov yam ntxwv ntawm PVS-Studio analyzer siv cov piv txwv ntawm EFL Core Libraries, 10-15% cuav zoo.
  6. PVS-Studio. Cov ntaub ntawv. Kev txwv ntau ntawm cov lus tshuaj ntsuam xyuas.
  7. Ivan Andryashin. Hais txog yuav ua li cas peb tau soj ntsuam zoo li qub ntawm peb qhov project ntawm kev kawm simulator ntawm X-ray endovascular phais.
  8. Pavel Eremeev, Svyatoslav Razmyslov. Yuav ua li cas pab pawg PVS-Studio txhim kho Unreal Engine code.
  9. Andrey Karpov. Yog vim li cas los qhia qhov zoo li qub code analyzer PVS-Studio rau hauv txoj kev loj hlob.

Yuav ua li cas siv tus lej ntsuas tus lej zoo li qub hauv txoj haujlwm qub txeeg qub teg yam tsis muaj kev txhawb nqa pab pawg

Yog tias koj xav qhia cov lus no nrog cov neeg hais lus Askiv, thov siv qhov txuas txhais lus: Andrey Karpov. Yuav ua li cas qhia tus lej ntsuas zoo li qub hauv txoj haujlwm qub txeeg qub teg thiab tsis txhob ua rau pawg neeg poob siab.

Tau qhov twg los: www.hab.com

Ntxiv ib saib