Clang 为什么AddressSanitizer将野生指针报告为堆缓冲区溢出,而不是在释放后使用

Clang 为什么AddressSanitizer将野生指针报告为堆缓冲区溢出,而不是在释放后使用,clang,address-sanitizer,Clang,Address Sanitizer,代码流是上面的注释。是因为释放的内存被其他代码或其他东西重新分配了吗 另一个测试代码导致空闲后使用当notifysetingschanged在查看对象被删除后立即被调用。是空闲后使用只能在相对较新的释放位置检测到(只要它们适合隔离内存)。您可以通过在ASAN\u OPTIONS=quantial\u size\u mb=512中设置更高的值来提高可检测性(x86上默认为256,Android/iOS上默认为16),但这无法修复根本原因 在您的特定情况下,内存可能以较小的大小重新分配,因此Asan

代码流是上面的注释。是因为释放的内存被其他代码或其他东西重新分配了吗


另一个测试代码导致
空闲后使用
notifysetingschanged
查看对象
被删除后立即被调用。

空闲后使用
只能在相对较新的释放位置检测到(只要它们适合隔离内存)。您可以通过在
ASAN\u OPTIONS=quantial\u size\u mb=512
中设置更高的值来提高可检测性(x86上默认为256,Android/iOS上默认为16),但这无法修复根本原因


在您的特定情况下,内存可能以较小的大小重新分配,因此Asan认为您有堆溢出。

空闲后使用
只能在相对较新的释放中检测到(只要它们适合隔离内存)。您可以通过在
ASAN\u OPTIONS=quantial\u size\u mb=512
中设置更高的值来提高可检测性(x86上默认为256,Android/iOS上默认为16),但这无法修复根本原因


在您的特定情况下,内存可能以较小的大小重新分配,因此Asan认为您有堆溢出。

我应该将选项放在哪里?@zoujyjs到
Asan\u OPTIONS
环境变量。我应该将选项放在哪里?@zoujyjs到
Asan\u OPTIONS
环境变量。
class ISettingChangedListener
{
public:
    virtual void NotifySettingsChanged() = 0;
};

class View : public ISettingChangedListener {
    // ...
}

// Set the listener as a pointer to a view
void System::SetListener(ISettingChangedListener *listener) {
    m_settings_changed_listener = listener;
}

// view is destroyed somewhere by delete

// after a while when the settings is about to change

void System::ChangeSettings() {
    // do some modify
    m_settings_changed_listener->NotifySettingsChanged(); // report a heap-over-flow instead of use-after-free
}