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:

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:

Instalační program pro Visual Studio snímku obrazovky se zvýrazněnou komponentou AddressSanitizer jazyka C++

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:

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

Snímek obrazovky příkazového řádku s příkazem pro kompilaci s možnostmi AddressSanitizer

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í:

Snímek obrazovky ladicího programu zobrazující základní chybu globálního přetečení

Červené zvýraznění, shora dolů

  1. Bezpečnostní chyba paměti je globální přetečení vyrovnávací paměti.
  2. Mimo libovolnou uživatelsky definovanou proměnnou byly uloženy 4 bajty (32 bitů).
  3. Úložiště proběhlo ve funkci definované main() v souboru na řádku basic-global-overflow.cpp 7.
  4. Proměnná s názvem x se definuje v souboru basic-global-overflow.cpp na řádku 3 počínaje sloupcem 8.
  5. Tato globální x proměnná má velikost 400 bajtů.
  6. Přesný stínový byte popisující adresu, na kterou cílí úložiště, měl hodnotu
  7. Stínová legenda o tom, že je oblast 0xf9 odsazení napravo od int 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.

Snímek obrazovky s dialogem Stránky vlastností zobrazující vlastnost Enable AddressSanitizer

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:

Snímek obrazovky ladicího programu zobrazující globální chybu přetečení vyrovnávací paměti

Použití AddressSanitizer z Visual Studio: CMake

Pokud chcete povolit AddressSanitizer pro projekt CMakevytvořený pro Windows, postupujte takto:

  1. Otevřete rozevírací seznam Konfigurace na panelu nástrojů v horní části integrovaného vývojového prostředí a vyberte Spravovat konfigurace.

    Snímek obrazovky s rozevíracím seznamem konfigurace CMake

    Tento výběr otevře Project Nastavení CMake, který je uložený v souboru CMakeSettings.json.

  2. V editoru zvolte odkaz Upravit JSON. Tento výběr přepne zobrazení na nezpracovaný json.

  3. Přidejte vlastnost addressSanitizerEnabled: true.

    Tento obrázek je z souboru CMakeSettings.json po této změně:

    Snímek obrazovky se zobrazením textového editoru souboru CMakeSettings.json

  4. 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.

Snímek obrazovky s chybovou zprávou 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 ):

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:

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