Sanitizerit: Address, Thread, UB Sanitizer
Löydä muisti-, säie- ja määrittelemättömän toiminnan virheitä sanitizer-työkaluperheen avulla.
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.outEsimerkki 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:12ThreadSanitizer (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 accessesUndefined 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.cppMemorySanitizer (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.outSanitizereilla 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.outPikatarkistus
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.
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
- Staattisen analyysin työkalut: clang-tidy, cppcheck
- Sanitizerit: Address, Thread, UB Sanitizer
- Fuzz-testaus libFuzzerilla
- Jatkuva integraatio C++-projekteille