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;
}
}