C++ Academy · Oppitunti

Sanitizerit: Address, Thread, UB Sanitizer

Löydä muisti-, säie- ja määrittelemättömän toiminnan virheitä sanitizer-työkaluperheen avulla.

Oppitunti 2/415 vaihetta

Sanitizerit: Address, Thread, UB Sanitizer on ilmainen C++ Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu C++ Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Ajon aikaiset tarkistimet

Sanitizerit ovat Clangiin ja GCC:hen sisäänrakennettuja, käännöksen aikana instrumentoitavia ajonaikaisia tarkistimia. Ne löytävät virheitä, joita tyyppijärjestelmä ei pysty havaitsemaan.

AddressSanitizer (ASan)

Havaitsee muistivirheitä: puskurin ylivuotoja, vapautetun muistin käyttöä, kaksinkertaista vapauttamista ja muistivuotoja. Hidastaa ohjelmaa noin kaksinkertaisesti.

g++ -fsanitize=address -g -O1 main.cpp
./a.out

Esimerkki ASan-tulosteesta

Kun ASan havaitsee virheen, se tulostaa pinojäljen, jossa näkyvät tarkka rivi ja virheen tyyppi.

==ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 4 at 0x60200000001c
    #0 0x... in main main.cpp:12

ThreadSanitizer (TSan)

Havaitsee datakilpailut ja muut samanaikaisuuteen liittyvät virheet. Hidastaa ohjelmaa noin 5–15-kertaisesti.

g++ -fsanitize=thread -g main.cpp
./a.out
# Reports concurrent unprotected accesses

Undefined Behavior Sanitizer (UBSan)

Havaitsee etumerkillisten kokonaislukujen ylivuodot, tyhjän osoittimen dereferoinnin, virheellisesti kohdistetun muistinkäytön, nollalla jakamisen ja paljon muuta.

g++ -fsanitize=undefined -g main.cpp

MemorySanitizer (MSan)

Havaitsee alustamattoman muistin lukemisen. Toimii vain Clangilla. Koko ohjelma, myös kirjastot, on käännettävä MSan-instrumentoituna.

LeakSanitizer

Sisältyy Linuxissa ASaniin. Raportoi muistialueet, jotka ovat edelleen varattuina ohjelman lopetessa.

ASAN_OPTIONS=detect_leaks=1 ./a.out

Sanitizereilla on hintansa

Kaikki sanitizerit hidastavat ohjelmia ja kuluttavat enemmän muistia. Käyttäkää niitä kehityksessä ja CI:ssä — älkää tuotantojulkaisuissa.

Kaikkia ei voi yhdistää

ASan, TSan ja MSan ovat keskenään yhteensopimattomia — ne instrumentovat muistia eri tavoin. UBSanin voi yhdistää muihin.

Kääntäjätuki

GCC tukee ASania, TSania ja UBSania. Clang tukee kaikkia edellä mainittuja sekä MSania. Valitsimet ovat samoja molemmissa kääntäjissä.

CI-integrointi

Suorittakaa testisarja CI:ssä jokaisen sanitizerin alla. Havaitkaa kilpailutilanteet ja muistivirheet ennen niiden päätymistä julkaisuun. Yhdistäkää tähän fuzzing, jotta kattavuus olisi mahdollisimman hyvä.

Vinkki: kääntäkää asetuksella -O1

Optimoikaa sanitizerien kanssa käännettäessä vähintään asetuksella -O1. -O0 toimii, mutta tekee vähemmän inline-laajennuksia, jolloin pinojäljet ovat vähemmän informatiivisia.

Vaiennustiedostot

Kirjoittakaa tunnettujen virheellisten positiivisten tulosten tai kolmannen osapuolen ongelmien käsittelemiseksi vaiennustiedosto ja pyytäkää sanitiszeria jättämään ne huomiotta.

ASAN_OPTIONS="suppressions=asan.supp" ./a.out

Pikatarkistus

Mikä sanitizer havaitsee säikeiden väliset datakilpailut?

Kertaus

Sanitizerit löytävät todellisia ajonaikaisia virheitä: AddressSanitizer muistivirheitä, ThreadSanitizer kilpailutilanteita, UBSan määrittelemätöntä toimintaa ja MSan alustamattoman muistin lukemista. Yhdistäkää ne CI:ssä testisarjaan, niin turvallisuus paranee merkittävästi.

Aloita maksutta

Opi C++ tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Sanitizerit: Address, Thread, UB Sanitizer” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa C++ Academy-oppimispolun 3 oppituntia, myös oppitunnin “Sanitizerit: Address, Thread, UB Sanitizer”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. C++ Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Sanitizerit: Address, Thread, UB Sanitizer”?

Löydä muisti-, säie- ja määrittelemättömän toiminnan virheitä sanitizer-työkaluperheen avulla. Harjoittelet C++ Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C++ Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C++ Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Sanitizerit: Address, Thread, UB Sanitizer”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C++ Academy-oppitunnilla?

Kyllä. Jokainen C++ Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Staattisen analyysin työkalut: clang-tidy, cppcheck
  2. Sanitizerit: Address, Thread, UB Sanitizer
  3. Fuzz-testaus libFuzzerilla
  4. Jatkuva integraatio C++-projekteille
← Takaisin: C++ Academy