【问题标题】:How do reference-counting smart pointer's avoid or handle reference-counter overflows?引用计数智能指针如何避免或处理引用计数器溢出?
【发布时间】:2017-05-22 14:42:13
【问题描述】:

在简单的引用计数智能指针实现中,引用计数器可能会溢出。在 C++ 标准库实现中如何避免或处理这种溢出?

【问题讨论】:

  • 我不确定您是否会溢出引用计数。如果他们使用size_t,那么他们应该无法分配足够的指针来溢出它。
  • std::shared_ptr 的函数返回引用计数器returns a long,所以我猜这是“软”限制。
  • 这是一个真正的问题。如果您每纳秒生成一个新引用,您将在不到 600 年的时间内溢出 64 位计数。
  • @stark 和您的指针会消耗比 64 位指针可以寻址的更多内存 :)
  • 如果你的程序溢出了一个引用计数器,你应该得到它。

标签: c++ automatic-ref-counting smart-pointers integer-overflow refcounting


【解决方案1】:

来自 stdlibc++ 标头的片段:

typedef int _Atomic_word;

class _Sp_counted_base
    /*snip*/
    _Atomic_word  _M_use_count;
    /*snip*/
    _M_weak_add_ref()
    { __gnu_cxx::__atomic_add_dispatch(&_M_weak_count, 1); }

/*snip*/
__atomic_add_dispatch(/*snip*/)
{
    /*snip*/
    __atomic_add_single(/*snip*/);
    /*snip*/
}

__atomic_add_single(/*snip*/)
{ *__mem += __val; }

结论:此特定实现通过忽略可能性来“处理”引用计数器溢出。

【讨论】:

  • 令人惊讶的是他们使用int,但至少对我来说,我很难设想一个使用 32767 指针指向同一事物的用例。
  • 一般情况下是的,但是如果攻击者设法产生一些导致程序创建它们的恶意输入怎么办?
  • @BobJansen 这可能很糟糕。另一个结论:您不应该让用户输入直接影响共享指针的数量而不受限制。事实上,我会将其扩展到任何分配内存(或其他资源)的东西。
  • 我刚刚查看了std::shared_ptr 的 MSVC++2017 实现。他们打电话给_InterlockedIncrement(),它也会溢出。
猜你喜欢
  • 2010-10-18
  • 1970-01-01
  • 2015-10-30
  • 2017-03-20
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多