防止C整数溢出

我有一些代码在一个函数,将增加/减less运算符更改/更新值。 例如:

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

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

我想要防范,但我想使用标准库常量。 我记得有一个size_t(或类似的)variables,将代表一个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) ... 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; } } 

在C中你想要的头文件是<stdint.h> ,常量是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"); } 

对于C ++,您可以使用任何数量的解决方案: 什么是UINT32_MAX的C ++等价物?

也许你正在寻找<limits> : http : //www.cplusplus.com/reference/limits/numeric_limits/

你可以做这样的事情来得到你想要的东西:

unsigned int n = numeric_limits<unsigned int>::max()

你也有这个<cstdint> : http : <cstdint>

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

如果你使用C,你正在寻找limits.h 。 你想要的宏是UINT_MAX

如果你在C ++世界,你需要std::numeric_limits<uint32_t>::max()

检查#include <stdint.h>http://en.wikipedia.org/wiki/C_data_types#Fixed_width_integer_types

你在找什么是UINT32_MAX

 static void update_value(char op) { if (op == '+') if (value == UINT_MAX) printf("Maximum value achieved.\n"); else value ++; else if (value == 0) printf("Minimum value achieved.\n"); else value --; } 

UINT_MAX ,对于这个常量,你必须包含limits.h

您需要limits.h(INT_MIN和INT_MAX):更多信息在这里: http ://www.cplusplus.com/reference/climits/