Объяснение
Средство очистки адресов выполняет множество дополнительных действий, например, проверяет, не записываете ли вы в память пределы памяти. Дезинфицирующее средство от утечек просто проверяет, забыли ли вы освободить память.
Документация
Вы можете прочитать об этом на странице параметров программы g cc .
-fsanitize=address
Включить AddressSanitizer, быстрый детектор ошибок памяти. Инструкции по доступу к памяти предназначены для обнаружения ошибок за пределами допустимого диапазона и использования после освобождения. Опция включает -fsanitize-address-use-after-scope
. См. https://github.com/google/sanitizers/wiki/AddressSanitizer для получения более подробной информации. На поведение во время выполнения может влиять переменная окружения ASAN_OPTIONS
. При значении help=1
доступные параметры отображаются при запуске инструментированной программы. См. https://github.com/google/sanitizers/wiki/AddressSanitizerFlags#run -time-flags для получения списка поддерживаемых опций. Эта опция не может сочетаться с -fsanitize=thread
.
-fsanitize=leak
Включить LeakSanitizer, детектор утечки памяти. Эта опция имеет значение только для связывания исполняемых файлов, а исполняемый файл связан с библиотекой, которая переопределяет mallo c и другие функции-распределители. См. https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer для более подробной информации. На поведение во время выполнения может влиять переменная окружения LSAN_OPTIONS
. Эта опция не может быть объединена с -fsanitize=thread
.
-fsanitize-address-use-after-scope
Включение санации локальных переменных для обнаружения ошибок использования после области действия. Опция устанавливает -fstack-reuse
в none
.
-fstack-reuse=reuse-level
Документацию можно найти на странице опций code gen .
This Опция контролирует повторное использование стека для объявленных пользователем локальных / авто переменных и сгенерированных компилятором временных переменных. reuse_level может быть 'all', 'named_vars' или 'none'. «all» включает повторное использование стека для всех локальных переменных и временных переменных, «named_vars» разрешает повторное использование только для определенных пользователем локальных переменных с именами, а «none» полностью отключает повторное использование стека. Значением по умолчанию является «все». Эта опция необходима, когда программа продлевает время жизни локальной переменной области действия или сгенерированного временного компилятора за пределы конечной точки, определенной языком. Когда время жизни переменной заканчивается, и если переменная живет в памяти, оптимизирующий компилятор может свободно использовать свое пространство стека с другими временными или локальными переменными с областями видимости, чей диапазон работы не перекрывается с ним. Устаревший код, расширяющий локальное время жизни, вероятно, сломается с оптимизацией повторного использования стека.
Например,
int *p;
{
int local1;
p = &local1;
local1 = 10;
....
}
{
int local2;
local2 = 20;
....
}
if (*p == 10) // out of scope use of local1
{
}
Другой пример:
struct A {
A(int k) : i(k), j(k) { }
int i;
int j;
};
A *ap;
void foo(const A& ar) {
ap = &ar;
}
void bar() {
foo(A(10)); // temp object's lifetime ends when foo returns
{
A a(20);
....
}
ap->i += 10; // ap references out of scope temp whose space
// is reused with a. What is the value of ap->i?
}
Время жизни компилятора сгенерированный временный код хорошо определен стандартом C ++. Когда время жизни временного элемента заканчивается, и если временное время жизни в памяти, оптимизирующий компилятор может свободно использовать свое пространство стека с другими временными или локальными переменными с областями видимости, чей диапазон действия не перекрывается с ним. Однако часть устаревшего кода зависит от поведения старых компиляторов, в которых пространство стека временных файлов не используется повторно, агрессивное повторное использование стека может привести к ошибкам во время выполнения. Эта опция используется для управления оптимизацией повторного использования временного стека.