Známé problémy s addressSanitizerem

Poznámka:

Pošlete nám zpětnou vazbu k tomu, co byste chtěli vidět v budoucích verzích, a pokud narazíte na problémy, nahlaste chyby .

Nekompatibilní možnosti a funkce

Tyto možnosti a funkce jsou nekompatibilní s /fsanitize=address a měly by být zakázané nebo se jim vyhnout.

  • Možnosti /RTC nejsou kompatibilní s AddressSanitizerem a měly by být zakázané.
  • Přírůstkové propojení není podporováno a mělo by být zakázané.
  • Funkce Upravit a pokračovat není podporována a měla by být zakázaná.
  • Koroutiny nejsou kompatibilní s AddressSanitizerem a obnovitelné funkce jsou vyloučené z instrumentace.
  • OpenMP není podporován a měl by být zakázaný.
  • Spravovaný jazyk C++ není podporován a měl by být zakázaný.
  • C++ AMP není podporován a mělo by být zakázáno.
  • aplikace Univerzální platforma Windows (UPW) nejsou podporovány.
  • Soubory se seznamem zvláštních případů nejsou podporovány.
  • MFC používající volitelnou alloc_dealloc_mismatch možnost modulu runtime není podporována.

Podpora standardní knihovny

Standardní knihovna MSVC (STL) je částečně kompatibilní, aby porozuměla addressSanitizeru a poskytovala další kontroly. Další informace najdete v tématu chyba přetečení kontejneru.

Pokud jsou poznámky zakázané nebo ve verzích bez podpory, výjimky AddressSanitizer vyvolané v kódu STL stále identifikují skutečné chyby. Nejsou ale tak přesné, jak by mohly být.

Tento příklad ukazuje nedostatek přesnosti a výhody povolení poznámek:

// Compile with: cl /fsanitize=address /Zi
#include <vector>

int main() {   
    // Create a vector of size 10, but with a capacity of 20.    
    std::vector<int> v(10);
    v.reserve(20);

    // In versions prior to 17.2, MSVC ASan does NOT raise an exception here.
    // While this is an out-of-bounds write to 'v', MSVC ASan
    // ensures the write is within the heap allocation size (20).
    // With 17.2 and later, MSVC ASan will raise a 'container-overflow' exception:
    // ==18364==ERROR: AddressSanitizer: container-overflow on address 0x1263cb8a0048 at pc 0x7ff6466411ab bp 0x005cf81ef7b0 sp 0x005cf81ef7b8
    v[10] = 1;

    // Regardless of version, MSVC ASan DOES raise an exception here, as this write
    // is out of bounds from the heap allocation.
    v[20] = 1;
}

Verze Windows

Vzhledem k tomu, že existují závislosti s konkrétními verzemi Windows, je podpora zaměřená na Windows 10. Nástroj MSVC AddressSanitizer byl testován na verzi 10.0.14393 (RS1) a 10.0.21323 (předběžná verze buildu Insider). Pokud narazíte na problémy, nahlaste chybu .

Využití paměti

Modul runtime AddressSanitizer nevyvolá paměť zpět do operačního systému během provádění. Z pohledu operačního systému to může vypadat jako nevracení paměti. Toto rozhodnutí o návrhu je záměrné, aby se předem nepřidělila všechna požadovaná paměť.

Umístění dll modulu runtime AddressSanitizer

Soubory clang_rt.asan*.dll runtime jsou nainstalovány vedle kompilátorů v .%VSINSTALLDIR%\VC\Tools\MSVC\<version>\bin\<host-arch>\<target-arch>\ Tato umístění jsou na cestě k ladicím relacím a v příkazových výzev pro vývojáře sady Visual Studio. Tyto soubory nejsou nikdy umístěny do C:\Windows\System32 nebo C:\Windows\SysWOW64.

Podpora vlastního seznamu vlastností

Okno Správce vlastností v integrovaném vývojovém prostředí sady Visual Studio umožňuje přidat do svých projektů vlastní .props soubory. I když je zobrazena vlastnost Enable Address Sanitizer (<EnableASAN>), sestavení ji nedotkuje. Je to proto, že vlastní .props soubory se zahrnou, Microsoft.cpp.propscož používá <EnableASAN> hodnotu k nastavení dalších vlastností.

Jako alternativní řešení můžete vytvořit Directory.Build.props soubor v kořenovém adresáři projektu, který definuje <EnableASAN> vlastnost. Další informace naleznete v tématu Přizpůsobení sestavení jazyka C++.

Viz také

Přehled AddressSanitizer
Referenční dokumentace k sestavení a jazyku AddressSanitizer
Referenční informace k modulu runtime AddressSanitizer
Stínové bajty AddressSanitizer
AddressSanitizer – cloud nebo distribuované testování
Integrace ladicího programu AddressSanitizer
Příklady chyb AddressSanitizer