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.
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;
}
Přepsání nového operátoru a odstranění
AddressSanitizer (ASAN) má vlastní verzi operator new
a operator delete
, které používá k vyhledání dalších chyb přidělení, jako je alloc_dealloc_mismatch
. Spuštění linkeru s /INFERASANLIBS
zajišťuje, že přepsání new
/delete
ASAN má nízkou prioritu, aby linker vybral všechny operator new
nebo operator delete
přepsání v jiných knihovnách ve vlastních verzích ASAN. V takovém případě nemusí být ASAN schopen zachytit některé chyby, které spoléhají na vlastní operator new
a operator delete
.
MFC obsahuje vlastní přepsání pro operator new
a operator delete
, takže může chybět, jako je alloc_dealloc_mismatch
.
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.props
což 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