Справочник по языку, сборке и отладке Аддресссанитизер

В разделах этой статьи описывается спецификация языка Аддресссанитизер, параметры компилятора и параметры компоновщика. они также описывают параметры, управляющие интеграцией Visual Studio отладчика, характерными для аддресссанитизер.

Дополнительные сведения о среде выполнения Аддресссанитизер см. в справочнике по среде выполнения. Он содержит сведения о перехваченных функциях и о том, как привязать пользовательские распределителя. Дополнительные сведения о сохранении аварийных дампов из Аддресссанитизер сбоев см. в справочнике по аварийному дампу.

Спецификация языка

__SANITIZE_ADDRESS__

__SANITIZE_ADDRESS__Макрос препроцессора определяется так, как 1 Если /fsanitize=address бы он был установлен. Этот макрос полезен для опытных пользователей при условии указания исходного кода на наличие среды выполнения Аддресссанитизер.

#include <cstdio>

int main() {
    #ifdef __SANITIZE_ADDRESS__
        printf("Address sanitizer enabled");
    #else
        printf("Address sanitizer not enabled");
    #endif
    return 1;
}

__declspec(no_sanitize_address)

__declspec(no_sanitize_address)Описатель можно использовать для выборочного отключения функции очистки для функций, локальных переменных или глобальных переменных. Это __declspec влияет на поведение компилятора , а не на поведение во время выполнения .

__declspec(no_sanitize_address)
void test1() {
    int x[100];
    x[100] = 5; // ASan exception not caught
}

void test2() {
    __declspec(no_sanitize_address) int x[100];
    x[100] = 5; // ASan exception not caught
}

__declspec(no_sanitize_address) int g[100];
void test3() {
    g[100] = 5; // ASan exception not caught
}

Компилятор

Параметр компилятора /fsanitize=address

/fsanitize=addressПараметр компилятора позволяет инструментировать ссылки памяти в коде для перехвата ошибок безопасности памяти во время выполнения. Обработчики инструментирования загружают, хранят, области, alloca и функции CRT. Он может обнаруживать скрытые ошибки, такие как недопустимые границы, использовать-After-Free, USE-AFTER-Scope и т. д. Неисчерпывающий список ошибок, обнаруженных во время выполнения, см. в разделе аддресссанитизер Error examples.

/fsanitize=address совместима со всеми существующими уровнями оптимизации C++ или C (например /Od/O1/O2/O2 /GL ,,,, и профильной оптимизации). Код, созданный с помощью этого параметра, работает со статическими и динамическими библиотек CRT ( /MD/MDd/MT например,,, и /MTd ). Этот параметр компилятора можно использовать для создания .EXE или .DLL, предназначенных для x86 или x64. Отладочная информация необходима для оптимального форматирования стеков вызовов.

Примеры кода, демонстрирующие несколько типов обнаружения ошибок, см. в разделе аддресссанитизер Error examples.

/fsanitize=fuzzer параметр компилятора (экспериментальный)

/fsanitize=fuzzerПараметр компилятора добавляет либфуззер в список библиотек по умолчанию. Также устанавливаются следующие параметры очистки:

Рекомендуется использовать /fsanitize=address с /fsanitize=fuzzer .

Эти библиотеки добавляются в список библиотек по умолчанию при указании /fsanitize=fuzzer :

Параметр среды выполнения Библиотека Либфуззер
/MT clang_rt.fuzzer_MT-{arch}
/MD clang_rt.fuzzer_MD-{arch}
/MTd clang_rt.fuzzer_MTd-{arch}
/MDd clang_rt.fuzzer_MDd-{arch}

Также доступны библиотеки Либфуззер, которые пропускают эту main функцию. Вы отвечаете за определение main и вызов методов LLVMFuzzerInitialize и LLVMFuzzerTestOneInput при использовании этих библиотек. Чтобы использовать одну из этих библиотек, укажите /NODEFAULTLIB и явно свяжите с библиотекой ниже, которая соответствует вашей среде выполнения и архитектуре:

Параметр среды выполнения Библиотека no_main Либфуззер
/MT clang_rt.fuzzer_no_main_MT-{arch}
/MD clang_rt.fuzzer_no_main_MD-{arch}
/MTd clang_rt.fuzzer_no_main_MTd-{arch}
/MDd clang_rt.fuzzer_no_main_MDd-{arch}

Если вы укажете /NODEFAULTLIB и не укажете одну из этих библиотек, вы получите неразрешенную ошибку ссылки на внешний символ.

/fsanitize-address-use-after-return параметр компилятора (экспериментальный)

по умолчанию компилятор MSVC (в отличие от Clang) не создает код для выделения кадров в куче, чтобы перехватывать ошибки использования после возврата. Чтобы перехватить эти ошибки с помощью Аддресссанитизер, необходимо:

  1. Скомпилируйте с помощью /fsanitize-address-use-after-return параметра.
  2. Перед выполнением программы выполните команду set ASAN_OPTIONS=detect_stack_use_after_return=1 , чтобы установить параметр проверки среды выполнения.

/fsanitize-address-use-after-returnПараметр приводит к тому, что компилятор создает код для использования двойного кадра стека в куче, когда локальные переменные считаются адресом. Этот код намного медленнее , чем использование /fsanitize=address только одного. Дополнительные сведения и пример см. в разделе Error: stack-use-after-return.

Двойной кадр стека в куче остается после возврата из функции, которая ее создала. Рассмотрим пример, где адрес локальной памяти, выделенной для слота в куче, используется после возврата. Теневые байты, связанные с фиктивным кадром кучи, содержат значение 0xF9. Это 0xF9 означает ошибку использования стека после возврата, когда среда выполнения сообщает об ошибке.

Кадры стека выделяются в куче и остаются после возврата функций. Среда выполнения использует сборку мусора для асинхронного освобождения этих фиктивных объектов кадра вызовов по истечении определенного интервала времени. Адреса локальных переменных передаются в постоянные кадры в куче. Система может определить, когда все локальные переменные используются после возврата определяющей функции. Дополнительные сведения см. в описании алгоритма использования стека после возврата в соответствии с документацией Google.

Компоновщик

/INFERASANLIBS[:NO] параметр компоновщика

/fsanitize=addressПараметр компилятора помечает объекты, чтобы указать библиотеку аддресссанитизер для связи с исполняемым файлом. Библиотеки имеют имена, начинающиеся с clang_rt.asan* . /INFERASANLIBSПараметр компоновщика (по умолчанию) связывает эти библиотеки из расположений по умолчанию автоматически. Ниже приведены библиотеки, которые выбираются и автоматически связываются в.

Параметр среды выполнения DLL или EXE Библиотеки среды выполнения Аддресссанитизер
/MT EXE clang_rt.asan-{arch}, clang_rt.asan_cxx-{arch}
/MT DLL clang_rt.asan_dll_thunk-{arch}
/MD ЛЮБОЙ clang_rt.asan_dynamic-{arch}, clang_rt.asan_dynamic_runtime_thunk-{arch}
/MTd EXE clang_rt.asan_dbg-{arch}, clang_rt.asan_dbg_cxx-{arch}
/MTd DLL clang_rt.asan_dbg_dll_thunk-{arch}
/MDd ЛЮБОЙ clang_rt.asan_dbg_dynamic-{arch}, clang_rt.asan_dbg_dynamic_runtime_thunk-{arch}

Параметр /INFERASANLIBS:NO компоновщика не позволяет компоновщику clang_rt.asan* связывать файл библиотеки из расположения по умолчанию. При использовании этого параметра добавьте путь к библиотеке в скриптах сборки. В противном случае компоновщик сообщает об ошибке неразрешенного внешнего символа.

интеграция Visual Studio

Параметр компилятора /fno-sanitize-address-vcasan-lib

/fsanitize=addressпараметр содержит ссылки в дополнительных библиотеках для улучшения Visual Studio отладки при возникновении исключения аддресссанитизер. Эти библиотеки называются вкасан. библиотеки позволяют Visual Studio отображать ошибки аддресссанитизер в исходном коде. Они также позволяют исполняемому файлу создавать аварийные дампы при создании отчета об ошибке Аддресссанитизер. дополнительные сведения см. в статье Visual Studio аддресссанитизер расширенная функциональная функциональность библиотека.

Выбранная библиотека зависит от параметров компилятора и автоматически связывается в.

Параметр среды выполнения Версия Вкасан
/MT libvcasan.lib
/MD vcasan.lib
/MTd libvcasand.lib
/MDd vcasand.lib

Однако при компиляции с использованием /Zl (опустить имя библиотеки по умолчанию) необходимо вручную указать библиотеку. Если этого не сделать, вы получите неразрешенную ошибку ссылки на внешний символ. Ниже приведены некоторые типичные примеры.

error LNK2001: unresolved external symbol __you_must_link_with_VCAsan_lib
error LNK2001: unresolved external symbol ___you_must_link_with_VCAsan_lib

Улучшенную отладку можно отключить во время компиляции с помощью /fno-sanitize-address-vcasan-lib параметра.

Переменная среды ASAN_VCASAN_DEBUGGING.

/fsanitize=addressПараметр компилятора создает двоичный файл, который предоставляет ошибки безопасности памяти во время выполнения. Когда двоичный файл запускается из командной строки, и среда выполнения сообщает об ошибке, она выводит сведения об ошибке. Затем выполняется выход из процесса. ASAN_VCASAN_DEBUGGINGпеременная среды может быть настроена на запуск интегрированной среды разработки Visual Studio немедленно, когда среда выполнения сообщает об ошибке. Этот параметр компилятора позволяет просмотреть ошибку, наложенную на исходный код, по точной строке и столбцу, вызвавшему ошибку.

Чтобы включить такое поведение, выполните команду set ASAN_VCASAN_DEBUGGING=1 перед запуском приложения. Вы можете отключить улучшенную отладку, выполнив set ASAN_VCASAN_DEBUGGING=0 процедуру.

См. также раздел

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