Поделиться через


Известные проблемы AddressSanitizer

Примечание.

Отправьте нам отзыв о том, что вы хотите увидеть в будущих выпусках, и сообщите об ошибках при возникновении проблем.

Несовместимые параметры и функциональные возможности

Эти параметры и функциональные возможности несовместимы и /fsanitize=address должны быть отключены или избегать.

Поддержка стандартной библиотеки

Стандартная библиотека MSVC (STL) частично просвещена для понимания AddressSanitizer и предоставления других проверок. Дополнительные сведения см. в статье об ошибке переполнения контейнеров.

Если заметки отключены или в версиях без поддержки, исключения AddressSanitizer, создаваемые в коде STL, по-прежнему определяют истинные ошибки. Тем не менее, они не так точны, как они могли бы быть.

В этом примере демонстрируется отсутствие точности и преимущества включения заметок:

// 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;
}

Версии Windows

Так как существуют зависимости с определенными версиями Windows, поддержка сосредоточена на Windows 10. MSVC AddressSanitizer был протестирован на 10.0.14393 (RS1) и 10.0.21323 (предварительная сборка предварительной оценки). Сообщите об ошибке при возникновении проблем.

Использование памяти

Среда выполнения AddressSanitizer не освобождает память в ОС во время выполнения. С точки зрения ОС это может выглядеть так, как утечка памяти. Это решение о проектировании намеренно, чтобы не выделять всю необходимую память заранее.

Расположения DLL среды выполнения AddressSanitizer

Файлы clang_rt.asan*.dll среды выполнения устанавливаются рядом с компиляторами.%VSINSTALLDIR%\VC\Tools\MSVC\<version>\bin\<host-arch>\<target-arch>\ Эти расположения находятся на пути в сеансах отладки и в командной строке разработчика Visual Studio. Эти файлы никогда не помещаются или C:\Windows\System32 C:\Windows\SysWOW64не помещаются.

Поддержка настраиваемого листа свойств

Окно Диспетчера свойств в интегрированной среде разработки Visual Studio позволяет добавлять пользовательские .props файлы в проекты. Несмотря на то, что показано свойство Enable Address Sanitizer (<EnableASAN>), сборка не учитывает ее. Это связано с тем, что пользовательские .props файлы будут включены после Microsoft.cpp.propsэтого, что использует <EnableASAN> значение для задания других свойств.

В качестве обходного решения можно создать Directory.Build.props файл в корневом каталоге проекта для определения <EnableASAN> свойства. Дополнительные сведения см. в разделе "Настройка сборок C++".

См. также

Обзор AddressSanitizer
Справочник по сборке и языку AddressSanitizer
Справочник по среде выполнения AddressSanitizer
Теневой байт AddressSanitizer
Облачное или распределенное тестирование AddressSanitizer
Интеграция отладчика AddressSanitizer
Примеры ошибок AddressSanitizer