AddressSanitizer
Přehled
Jazyky jazyka C++ jsou výkonné, ale mohou mít problémy s chybou, které mají vliv na správnost programu & a zabezpečení programu. Od verze Visual Studio 2019 verze 16.9 podporuje kompilátor Microsoft C/C++ (MSVC) a integrované vývojové prostředí AddressSanitizer. AddressSanitizer (ASan) je technologie kompilátoru a modulu runtime, která zveřejňuje mnoho chyb, které nelze najít, s nulovými falešně pozitivními výsledky:
- Neshody a neshody typů alloc/dealloc
delete - Přidělení pro haldu jsou příliš velká
- přetečení a přetečení
- Dvakrát zdarma apo bezplatném použití
- Přetečení globální proměnné
- Přetečení vyrovnávací paměti haldy
- Neplatné zarovnání zarovnaných hodnot
memcpymemcpy- Přetečení a podtečení vyrovnávací paměti zásobníku
- Použití zásobníku po a použít po oboru
- Použití paměti po jeho poškození
Využijte AddressSanitizer ke zkrácení doby strávené:
- Základní správnost
- Přenositelnost mezi platformami
- Zabezpečení
- Zátěžové testování
- Integrace nového kódu
AddressSanitizer, původně představený Googlem,je výkonnou alternativou k metodě (kontrola chyb za běhu) i (statická analýza). Poskytuje technologie pro hledání chyb za běhu, které přímo používají vaše stávající systémy sestavení a existující testovací prostředky.
AddressSanitizer je integrovaný se systémem Visual Studio projektu, sestavovačem CMake a integrovaným vývojovém prostředím (IDE). Projekty mohou povolit AddressSanitizer nastavením vlastnosti projektu nebo pomocí jedné další možnosti kompilátoru: /fsanitize=address . Nová možnost je kompatibilní se všemi úrovněmi optimalizace a konfigurací x86 a x64. Je ale nekompatibilní s vlastnostmi edit-and-continue,přírůstkové propojovánía .
Počínaje Visual Studio 2019 verze 16.9 umožňuje technologie AddressSanitizer od Microsoftu integraci s Visual Studio IDE. Funkce může volitelně vytvořit soubor s výpisem stavu systému, když sanitizér najde chybu za běhu. Pokud nastavíte proměnnou prostředí před spuštěním programu, vytvoří se soubor s výpisem stavu systému s dodatečnými metadaty pro efektivní dodatečné ladění přesně ASAN_SAVE_DUMPS=MyFileName.dmp diagnostikovaných chyb. ASAN_SAVE_DUMPS=MyFileName.dmp Tyto soubory s výpisem paměti usnadňují rozšířené využití addressSanitizer pro:
- Testování místního počítače,
- Místní distribuované testování a
- Cloudové pracovní postupy pro testování.
Instalace AddressSanitizer
Integrace a knihovny integrovaného vývojového prostředí AddressSanitizer se ve výchozím nastavení instaluje s úlohami C++ v Instalační program pro Visual Studio. Pokud ale upgradujete ze starší verze Visual Studio 2019, pomocí instalačního programu povolte podporu ASan po upgradu:
Pokud se chcete dostat na výše uvedenou obrazovku, Visual Studio můžete v existující instalaci Instalační program pro Visual Studio změnit.
Poznámka
Pokud spustíte Visual Studio nové aktualizaci, ale ještě nemáte nainstalovanou ASan, při spuštění kódu se zobrazí chyba:
LNK1356: Nelze najít knihovnu clang_rt.asan_dynamic-i386.lib.
Použití AddressSanitizer
Začněte se sestavováním spustitelných souborů s /fsanitize=address možností kompilátoru pomocí kterékoli z těchto běžných metod vývoje:
- Sestavení příkazového řádku
- Projektový systém sady Visual Studio
- Visual Studio integrace CMake
Znovu zkompilujte a pak program normálně spusťte. Toto generování kódu zveřejňuje mnoho typů přesně diagnostikovaných chyb. Tyto chyby se hlásit třemi způsoby: v integrovaném vývojovém prostředí ladicího programu, na příkazovém řádku nebo v novém typu souboru s výpisem paměti pro přesné zpracování mimo řádek.
Microsoft doporučuje používat AddressSanitizer v těchto třech standardních pracovních postupech:
Vnitřní smyčka vývojáře
- Visual Studio – příkazový řádek
- Visual Studio – Project systém
- Visual Studio – CMake
CI/CD – kontinuální integrace / průběžný vývoj
- Zasílání zpráv o chybách – Nové soubory výpisu adresSanitizer
Fuzzing – sestavení s obálkou libFuzzer
- Azure OneFuzz
- Místní počítač
Tento článek se věnuje informacím, které potřebujete k povolení tří výše uvedených pracovních postupů. Informace jsou specifické pro konkrétní platformu, Windows 10 implementace AddressSanitizer. Tato dokumentace doplňuje vynikající dokumentaci od Googlu, Applu a GCC publikovali.
Poznámka
Aktuální podpora je omezená na x86 a x64 na Windows 10. Pošlete nám svůj názor na to, co byste rádi viděli v budoucích verzích. Vaše zpětná vazba nám pomůže určit prioritu dalších sanitizérů pro budoucnost, například /fsanitize=thread , , , nebo /fsanitize=leak/fsanitize=memory/fsanitize=undefined/fsanitize=hwaddress . Pokud dojde k problémům, můžete tady nahlásit chyby.
Použití AddressSanitizer z příkazového řádku vývojáře
Pomocí možnosti /fsanitize=address kompilátoru na /fsanitize=address povolte kompilaci pro modul runtime AddressSanitizer. Možnost /fsanitize=address je kompatibilní se všemi existujícími úrovněmi optimalizace C++ nebo C (například , , , a /Od/O1/O2/O2 /GLPGO ). Možnost funguje se statickými a dynamickými crty (například /MD , /MDd , a /MT/MTd ). Funguje bez ohledu na to, jestli vytvoříte soubor EXE nebo knihovnu DLL. Informace o ladění jsou vyžadovány pro optimální formátování zásobníků volání. V následujícím příkladu cl /fsanitize=address /Zi se předá příkazový řádek.
Knihovny AddressSanitizer (soubory .lib) se pro vás automaticky provázané. Další informace najdete v referenčních informacích k jazyku AddressSanitizer, sestavení a ladění.
Příklad – základní přetečení globální vyrovnávací paměti
// basic-global-overflow.cpp
#include <stdio.h>
int x[100];
int main() {
printf("Hello!\n");
x[100] = 5; // Boom!
return 0;
}
Pomocí příkazového řádku vývojáře pro Visual Studio 2019 zkompilujte main.cpp pomocí/fsanitize=address /Zi
Když spustíte výsledný main.exe příkaz na příkazovém řádku, vytvoří se formátovaná zpráva o chybách, která je vidět níže.
Zamyslete se nad přeplňovaně červenými rámečky, které zvýrazňují sedm klíčových informací:
Červené zvýraznění, shora dolů
- Bezpečnostní chyba paměti je globální přetečení vyrovnávací paměti.
- Mimo libovolnou uživatelsky definovanou proměnnou byly uloženy 4 bajty (32 bitů).
- Úložiště proběhlo ve funkci definované
main()v souboru na řádkubasic-global-overflow.cpp7. - Proměnná s názvem
xse definuje v souboru basic-global-overflow.cpp na řádku 3 počínaje sloupcem 8. - Tato globální
xproměnná má velikost 400 bajtů. - Přesný stínový byte popisující adresu, na kterou cílí úložiště, měl hodnotu
- Stínová legenda o tom, že je oblast
0xf9odsazení napravo odint x[100]
Poznámka
Názvy funkcí v zásobníku volání se produkuje prostřednictvím symbolizátoru LLVM, který modul runtime vyvolá při chybě.
Použití AddressSanitizer v Visual Studio
AddressSanitizer je integrovaný s integrovaným Visual Studio IDE. Pokud chcete pro projekt MSBuild addressSanitizer zapnout, klikněte pravým tlačítkem na projekt v Průzkumník řešení zvolte Vlastnosti. V dialogovém okně Stránky vlastností vyberte Vlastnosti konfiguraceC/C++Obecné a pak upravte vlastnost Povolit AddressSanitizer. Zvolte OK a uložte změny.
Pokud chcete sestavení z integrovaného vývojového prostředí (IDE) vyjádřit výslovný nesouhlas s nekompatibilními možnostmi. Pro existující projekt zkompilovaný pomocí /Od (nebo režimu ladění) možná budete muset tyto možnosti vypnout:
- Vypnutí úprav a pokračování
- Vypnout (kontroly modulu runtime)
- Vypnout (přírůstkové propojení)
Pokud chcete ladicí program sestavit a spustit, zadejte F5. Toto okno se zobrazí v Visual Studio:
Použití AddressSanitizer z Visual Studio: CMake
Pokud chcete povolit AddressSanitizer pro projekt CMakevytvořený pro Windows, postupujte takto:
Otevřete rozevírací seznam Konfigurace na panelu nástrojů v horní části integrovaného vývojového prostředí a vyberte Spravovat konfigurace.
Tento výběr otevře Project Nastavení CMake, který je uložený v souboru CMakeSettings.json.
V editoru zvolte odkaz Upravit JSON. Tento výběr přepne zobrazení na nezpracovaný json.
Přidejte vlastnost addressSanitizerEnabled: true.
Tento obrázek je z souboru CMakeSettings.json po této změně:
Stisknutím kláves Ctrl+S uložte tento soubor JSON a pak zadejte F5, který se zkompiluje a spustí v ladicím programu.
Tento snímek obrazovky zachycuje chybu ze sestavení CMake.
Výpisy stavu systému AddressSanitizer
Zavedli jsme nové funkce v AddressSanitizer pro použití s cloudovými a distribuovaných pracovními postupy. Tato funkce umožňuje offline zobrazení chyby AddressSanitizer v integrovaném vývojovém prostředí (IDE). Chyba se přecení nad vaším zdrojem, stejně jako v živé ladicí relaci.
Tyto nové soubory s výpisem paměti mohou při analýze chyby vést k efektivitě. Nemusíte znovu spustit, najít vzdálená data nebo hledat počítač, který se vypnul.
Vytvoření nového typu souboru s výpisem paměti, který lze zobrazit Visual Studio později na jiném počítači:
set ASAN_SAVE_DUMPS=MyFileName.dmp
Od Visual Studio 16.9 můžete nad zdrojovým kódem zobrazit přesně diagnostikovanou chybu uloženou v souboru.
Tato nová funkce výpisu stavu systému umožňuje cloudové pracovní postupy nebo distribuované testování. Můžete ji také použít k zapište podrobnou chybu s akcemi v libovolném scénáři.
Příklady chyb
AddressSanitizer dokáže detekovat několik druhů chyb zneužití paměti. Tady je mnoho chyb modulu runtime hlášených při spuštění binárních souborů zkompilovaných pomocí možnosti kompilátoru AddressSanitizer ( /fsanitize=address ):
alloc-dealloc-mismatchallocation-size-too-bigcalloc-overflowdouble-freedynamic-stack-buffer-overflowglobal-buffer-overflowheap-buffer-overflowheap-use-after-freeinvalid-allocation-alignmentmemcpy-param-overlapnew-delete-type-mismatchstack-buffer-overflowstack-buffer-underflowstack-use-after-returnstack-use-after-scopestrncat-param-overlapuse-after-poison
Další informace o příkladech najdete v tématu Příklady chyb AddressSanitizer.
Rozdíly ve Clangu 12.0
MSVC se v současné době liší od jazyka Clang 12.0 ve dvou funkčních oblastech:
- stack-use-after-scope – toto nastavení je ve výchozím nastavení zapnuté a nelze ho vypnout.
- stack-use-after-return – tato funkce vyžaduje další možnost kompilátoru a není dostupná jenom nastavením .
Tato rozhodnutí byla provedena za účelem snížení testovací matice potřebné k doručení této první verze.
Funkce, které by mohly vést k falešně pozitivním výsledkům Visual Studio 2019 16.9, nebyly zahrnuty. Tato disciplína vynucuje efektivní integritu testování potřebnou při zvažování spolupráce s desítkami let stávajícího kódu. V pozdějších verzích je možné zvážit další možnosti:
- Inicializační objednávka Fi 1
- Přetečení uvnitř objektu
- Container Overflow
- Odčítání/porovnání ukazatele
Další informace najdete v tématu Sestavení pro AddressSanitizer s MSVC.
Stávající oborová dokumentace
Pro tyto jazykové implementace a implementace technologie AddressSanitizer závislá na platformě už existuje rozsáhlá dokumentace.
Implementace je popsána v tomto zásadním dokumentu k AddressSanitizer.
Viz také
Známé problémy s AddressSanitizerem
Referenční informace k sestavení a jazyku AddressSanitizer
Referenční informace k modulu runtime AddressSanitizer
Stínové bajty AddressSanitizer
Cloud AddressSanitizer nebo distribuované testování
Integrace ladicího programu AddressSanitizer
Příklady chyb AddressSanitizer