首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何安全地比较两个无符号整数计数器?

如何安全地比较两个无符号整数计数器?
EN

Stack Overflow用户
提问于 2018-06-09 02:53:00
回答 4查看 1.1K关注 0票数 1

我们有两个无符号计数器,我们需要对它们进行比较,以检查一些错误条件:

代码语言:javascript
复制
uint32_t a, b;
// a increased in some conditions
// b increased in some conditions
if (a/2 > b) {
   perror("Error happened!");
   return -1;
}

问题是ab总有一天会溢出。如果a溢出,它仍然是正常的。但如果b溢出,这将是一个错误警报。如何使这张格子防弹?

我知道制作ab uint64_t会延迟这个错误警报。但是它仍然不能完全解决这个问题。

===============

让我澄清一点:计数器用于跟踪内存分配,这个问题在dmalloc/chunk.c中发现

代码语言:javascript
复制
#if LOG_PNT_SEEN_COUNT
  /*
   * We divide by 2 here because realloc which returns the same
   * pointer will seen_c += 2.  However, it will never be more than
   * twice the iteration value.  We divide by two to not overflow
   * iter_c * 2.
   */
  if (slot_p->sa_seen_c / 2 > _dmalloc_iter_c) {
    dmalloc_errno = ERROR_SLOT_CORRUPT;
    return 0;
  }
#endif
EN

回答 4

Stack Overflow用户

发布于 2018-06-09 03:12:27

发布的代码实际上似乎没有使用可能回绕的计数器。

代码中的注释所说的是,比较a/2 > b而不是a > 2*b更安全,因为后者可能会溢出,而前者不会。这对于a的类型比b的类型更大。

票数 4
EN

Stack Overflow用户

发布于 2018-06-09 02:59:37

通过强制两个值同时换行,使值在换行时立即规格化。在包装时保持两者之间的差异。

试试这样的东西;

代码语言:javascript
复制
uint32_t a, b;
// a increased in some conditions
// b increased in some conditions
if (a or b is at the maximum value) {
   if (a > b)
   {
     a = a-b; b = 0;
   }
   else
   {
     b = b-a; a = 0;
   }
}
if (a/2 > b) {
   perror("Error happened!");
   return -1;
}
票数 2
EN

Stack Overflow用户

发布于 2018-06-09 02:56:46

如果使用64位还不够,那么您需要编写自己的"var increase“方法,而不是重载++操作符(如果您不小心,这可能会弄乱您的代码)。

该方法只会将var重置为“0”或其他有意义的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50766828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档