C++ 防止C整数溢出

C++ 防止C整数溢出,c++,c,linux,C++,C,Linux,我在函数中有一些代码,它将使用递增/递减运算符更改/更新值。例如: static void update_value(char op) { if (op == '+') value++; // uint32_t global value else value--; } #include "limits.h" static void update_int(char op, int *value) { int val

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

static void update_value(char op)
{
    if (op == '+')
        value++;    // uint32_t global value
    else
        value--;
}
#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;
  }
}
该函数不检查是否超过/低于最大/最小值。因此,当值为16时,调用方可以调用它20次。结果是2^32-1-4


我想避免这种情况,但我想使用标准库常量。我记得有一个size_t(或类似的)变量,它表示uint32_t可以容纳的最大数字


我记不起确切的常数,也记不起它们定义的标题。有什么帮助吗?

如果您使用的是C,那么您需要的是。所需的宏是
UINT\u MAX


如果你在C++世界,你想要。

也许你正在寻找<代码> <代码>:

您可以这样做以获得您想要的:

unsigned int n=numeric\u limits::max()

您也有这样的


UINTN_MAX:C中精确宽度无符号类型的最大值(正好是2^N-1)

您想要的头文件是
,常量是
UINT32_MAX

static void update_value(char op)
{
    if (op == '+')
        if ( value < (UINT32_MAX - 1))
            value++;    // uint32_t global value
        else
            printf("too big!\n");
    else
       if (value > 0)
           value--;
       else
           printf("too small!\n");
}
static void update_值(char op)
{
如果(op=='+')
如果(值<(UINT32_最大值-1))
value++;//uint32_t全局值
其他的
printf(“太大!\n”);
其他的
如果(值>0)
价值--;
其他的
printf(“太小!\n”);
}
< C++ >可以使用任意数量的解决方案:

< p>检查<代码>包含< /COD>和

您正在寻找的是
UINT32\u MAX

您需要限制。h(INT\u MIN和INT\u MAX):更多信息如下:


UINT\u MAX
,对于该常数,您必须包括
限制。h

我发现最通用的解决方案是检查增量值是否实际大于先前值,或者递减值是否小于先前值。只有当值是无符号的,与变量的大小无关,并且与C代码一样具有可移植性时,这种方法才有效

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

C或C++答案将不同,“Unt32的最大数量可以保持”-<代码> ~(UTI32),0 < /代码> @ CHILL:这只适用于某些系统。便携解决方案使用的是限制包括中定义的限制。uint32_t可以保持的最大值始终为42.9亿(2^32),或者更容易写入:0xFFFFFF。简单地对其进行硬编码,32位总是32位。事实上,C99标准明确规定,“如果升级的类型是无符号类型,则表达式
~E
相当于该类型中可表示的最大值减去
E
[6.5.3.3一元算术运算符4]”,即
uint32\u t
,不是
int
。事实上,UINT\u MAX与uint32\u t没有任何关联。具有讽刺意味的是
n
int
)的类型会触发溢出;)这与发布的唯一正确答案uint32\u t?+1有什么关系?您还应该防止下溢。请参见UINT32_最大值不在限制内。h.@Lundin抱歉,它在
stdint.h
这与UINT32_t有什么关系?
#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;
  }
}