为什么AddressSanitizer将wild指针报告为堆缓冲区溢出而不是use-after-free

时间:2018-03-10 09:37:51

标签: clang address-sanitizer

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
}

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

在删除use-after-free后立即调用NotifySettingsChanged时,View object会产生另一个测试代码结果。

1 个答案:

答案 0 :(得分:1)

use-after-free只能在相对较新的解除分配中检测到(只要它们适合隔离的内存)。您可以通过在ASAN_OPTIONS=quarantine_size_mb=512中设置更高的值来提高可检测性(x86上的默认值为256,Android / iOS上为16)但这无法解决根本原因。

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