c – 防止C整数溢出

前端之家收集整理的这篇文章主要介绍了c – 防止C整数溢出前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我在函数中有一些代码,它将使用递增/递减运算符更改/更新值.例如:

static void update_value(char op)
{
    if (op == '+')
        value++;    // uint32_t global value
    else
        value--;
}

函数不会检查我们是否超过/低于最大/最小值.因此,当值为16时,调用者可以将其调用20次.结果为2 ^ 32 – 1 – 4.

我想提防,但我想使用标准库常量.我记得有一个size_t(或类似)变量代表uint32_t可以容纳的最大数字.

我不记得确切的常数和它们被定义的标题.有帮助吗?

最佳答案
我发现最常见的解决方案是检查递增的值是否实际上大于先前的值,或者递减的值是否小于先前的值.这仅在值无符号时才有效,与变量的大小无关,并且与C代码一样可移植.

static void update_value(char op)
{
  if (op == '+') {
    if (value + 1 > value) value ++;
  } else {
    if (value - 1 < value) value --;
  }
}

请注意,代码可能碰巧使用有符号值,但根据C标准,这将是未定义的行为,并且编译器可以自由替换if(value 1> value)… with if(0)….您不应将此代码与签名值一起使用,除非您有一个流程来在链接后审核生成的目标代码.

使用gcc和clang,您需要添加-fwrapv选项以使此代码适用于签名值;与其他编译器,您的里程可能会有所不同

这样做的唯一理智方法是特定于类型并使用来自limits.h的常量.例如:

#include "limits.h"

static void update_int(char op,int *value)
{
  int val = *value; // ignoring NULL pointer dereference

  if (op == '+') {
    if (val != INT_MAX) *value = val + 1;
  } else {
    if (val != INT_MIN) *value = val - 1;
  }
}

static void update_int(char op,unsigned int *value)
{
  unsigned int val = *value; // ignoring NULL pointer dereference

  if (op == '+') {
    if (val != UINT_MAX) *value = val + 1;
  } else {
    if (val != UINT_MIN) *value = val - 1;
  }
}
原文链接:https://www.f2er.com/linux/440736.html

猜你在找的Linux相关文章