Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Senden Sie uns Feedback dazu, was Sie in zukünftigen Versionen sehen möchten, und melden Sie Fehler , wenn Probleme auftreten.
Inkompatible Optionen und Funktionen
Die folgenden Optionen und Funktionen sind nicht kompatibel mit /fsanitize=address und sollten deaktiviert oder vermieden werden.
- Die
/RTC-Optionen sind mit AddressSanitizer nicht kompatibel und sollten deaktiviert werden. - Die inkrementelle Verknüpfung wird nicht unterstützt und sollte deaktiviert werden.
- Edit-and-Continue (Bearbeiten und fortfahren) wird nicht unterstützt und sollte deaktiviert werden.
- Coroutines sind nicht mit AddressSanitizer kompatibel, und fortsetzbare Funktionen sind von der Instrumentierung ausgenommen.
- OpenMP wird nicht unterstützt und sollte deaktiviert werden.
- Verwaltetes C++ wird nicht unterstützt und sollte deaktiviert werden.
- (C++ AMP) wird nicht unterstützt und sollte deaktiviert werden.
- Universelle Windows-Plattform (UWP)-Anwendungen werden nicht unterstützt.
- Sonderfalllistendateien werden nicht unterstützt.
-
Vorkompilierte Kopfzeilen, die ohne
/fsanitize=addresswird nicht unterstützt.
Standardbibliotheksunterstützung
Die Microsoft Visual C++ (MSVC)-Standardbibliothek (STL) verwendet die AddressSanitizer teilweise und stellt weitere Codesicherheitsprüfungen bereit. Weitere Informationen finden Sie unter container-overflow "Fehler".
Wenn Anmerkungen deaktiviert sind oder in Versionen der Standardbibliothek, die sie nicht unterstützen, identifizieren AddressSanitizer-Ausnahmen, die im STL-Code ausgelöst werden, weiterhin echte Fehler. Sie sind jedoch präziser, wenn Anmerkungen aktiviert sind und Sie eine Version der Standardbibliothek verwenden, die sie unterstützt.
In diesem Beispiel wird das Fehlen von Genauigkeit und die Vorteile der Aktivierung von Anmerkungen veranschaulicht:
// 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;
}
Außerkraftsetzung operator new und delete
AddressSanitizer (ASan) verwendet eine benutzerdefinierte Version von operator new und operator delete um Zuordnungsfehler wie alloc_dealloc_mismatch. Führen Sie den Linker aus/INFERASANLIBS, um sicherzustellen, dass die Außerkraftsetzung von new/deleteASan eine niedrigere Priorität hat, sodass der Linker in anderen Bibliotheken über die benutzerdefinierten Versionen von ASan entscheidet operator new oder operator delete überschreibt. In diesem Fall kann ASan einige Fehler nicht abfangen, die auf ihren benutzerdefinierten und operator new.operator delete
MFC enthält benutzerdefinierte Außerkraftsetzungen für operator new und operator delete. Wenn Microsoft Foundation Classes (MFC) außer den bereitgestellten operator new ASan-Außerkraftsetzungen verwendet werden und operator deleteASan fehler möglicherweise vollständig fehlt oder sie als Ergebnis falsch klassifizieren. Die folgenden Fehler können verpasst oder falsch klassifiziert werden:
alloc_dealloc_mismatchdouble-freeheap-use-after-freeheap-buffer-overflownew-delete-type-mismatch
Speicherauslastung
Die AddressSanitizer-Laufzeit gibt arbeitsspeicher während der Ausführung nicht wieder auf das Betriebssystem zurück, sodass der Arbeitsspeicher nicht alle vorab zugeordnet ist. Aus Sicht des Betriebssystems sieht es möglicherweise so aus, als ob es einen Speicherverlust gibt.
AddressSanitizer-Laufzeit-DLL-Speicherorte
Die clang_rt.asan*.dll Laufzeitdateien werden neben den Compilern in %VSINSTALLDIR%\VC\Tools\MSVC\<version>\bin\<host-arch>\<target-arch>\installiert. Diese Speicherorte befinden sich im Pfad in Debugsitzungen und in Visual Studio-Entwickler-Eingabeaufforderungen. Diese Dateien werden niemals in C:\Windows\System32 oder C:\Windows\SysWOW64.
Unterstützung für benutzerdefinierte Eigenschaftenblätter
Mit dem Visual Studio Property Manager-Fenster können Sie Ihren Projekten benutzerdefinierte .props Dateien hinzufügen. Obwohl die Enable AddressSanitizer-Eigenschaft (<EnableASAN>) angezeigt wird, berücksichtigt der Build ihn nicht. Der Build berücksichtigt sie nicht, da die benutzerdefinierten .props Dateien enthalten Microsoft.cpp.propssind, die den <EnableASAN> Wert zum Festlegen anderer Eigenschaften verwenden.
Erstellen Sie als Problemumgehung eine Directory.Build.props Datei im Stammverzeichnis Ihres Projekts, um die <EnableASAN> Eigenschaft zu definieren. Weitere Informationen finden Sie unter Anpassen von C++-Builds.
Lokale Threadvariablen
Lokale Threadvariablen (globale Variablen, die mit __declspec(thread) oder thread_local) deklariert wurden, sind nicht durch AddressSanitizer geschützt. Diese Einschränkung ist nicht spezifisch für Windows oder Microsoft Visual C++, sondern eine allgemeine Einschränkung.
Benutzerdefinierter Code überspringt die rückgabesequenz der normalen Funktion.
Die Verwendung von benutzerdefiniertem Code oder der Assemblysprache, um den aktuellen Stapelframe zu verlassen, ohne die üblichen Rückgabemechanismen zu berücksichtigen, wird nicht unterstützt. Beispielsweise kann das Verlassen des aktuellen Stapelrahmens über einen langen Sprung falsche positive Ergebnisse erzeugen.
Rufen Sie stattdessen vor dem Aufrufen von benutzerdefiniertem langsprungähnlichem Code auf __asan_handle_no_return() . Diese Funktion löscht alle Schattenbytes, die dem Stapel des aktuellen Threads zugeordnet sind, was zu einer verlorenen Abdeckung führt und das Risiko falsch negativer Negativer einführt. Aber Ihr Programm kann den Stapel dann sicher entspannen, ohne aufgrund veralteter Stapelschattenbytes falsch positiv zu laufen.
Probleme mit teilweise sanierten ausführbaren Dateien
Wenn der gesamte Code in einem Prozess nicht kompiliert /fsanitize=addresswird, kann ASan möglicherweise nicht alle Speichersicherheitsfehler diagnostizieren. Das häufigste Beispiel ist, wenn eine mit ASan kompilierte DLL in einen Prozess geladen wird, der Code enthält, der nicht mit ASan kompiliert wurde. In diesem Fall versucht ASan, Zuordnungen zu kategorisieren, die vor der ASan-Initialisierung stattgefunden haben. Sobald diese Zuordnungen neu zugewiesen wurden, versucht ASan, die Lebensdauer des Speichers zu besitzen und zu überwachen.
Wenn alle mit ASan kompilierten DLLs aus dem Prozess entladen werden, bevor der Prozess beendet wird, kann es zu Abstürzen kommen, da Verweise auf abgefangene Funktionen wie memcmp, memcpy, memmoveusw. abgefangen werden. Um optimale Ergebnisse zu erzielen, kompilieren Sie alle Module, die getestet /fsanitize=addresswerden, oder entladen Sie module nicht, die nach der Eingabe des Prozesses mit ASan kompiliert wurden.
Melden Sie alle Fehler an unserer Entwicklercommunity.
ASan 64-Bit–Ausnahmen für die erste Chance
Auf x64 belegt der Schattenbytebereich von MSVC ASan mehrere Terabyte des virtuellen Adressraums. ASan stellt diesen Speicher nicht vorab fest. Stattdessen wird on-Demand-Paging verwendet. Wenn zum ersten Mal auf eine Schattenseite zugegriffen wird, tritt eine Ausnahme des Fehlers der ersten Chance auf Seiten auf und wird von ASan behandelt, wodurch die Seite ausgeführt wird.
Der Visual Studio-Debugger behandelt dies ordnungsgemäß und zeigt diese Ablaufverfolgungen nicht an. Debugger wie WinDbgX können jedoch standardmäßig für jede Ausnahme unterbrechungen. Das Deaktivieren von Unterbrechungen bei Ausnahmen mit der ersten Chance wird empfohlen. In WinDbgX entspricht dies beispielsweise dem sxd av Befehl.
Siehe auch
AddressSanitizer -Übersicht
AddressSanitizer Build- und Sprachreferenz
AddressSanitizer-Laufzeitreferenz
AddressSanitizer-Schattenbytes
AddressSanitizer-Cloud oder verteilte Tests
AddressSanitizer Debugger-Integration
Beispiele für AddressSanitizer-Fehler