代码之家  ›  专栏  ›  技术社区  ›  Joey.Z

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

  •  0
  • Joey.Z  · 技术社区  · 8 年前
    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 回复  |  直到 8 年前
        1
  •  3
  •   yugr    8 年前

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

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