C++ 加法运算溢出风险:如何避免和处理?
这条 C++ 规范表明在进行加法运算时,需要先进行校验,确保不会发生数据溢出,然后再进行求和操作。 对于 size_t 类型,需要先校验 SIZE_MAX - m < n,确保 m 和 n 相加不会超出 size_t 类型的最大值。
示例 1:
unsigned int a = 4294967295; // 2^32 - 1
unsigned int b = 1;
unsigned int c = a + b; // 此时 c 的值为 0,发生了数据溢出
示例 2:
size_t m = 4294967295; // 2^32 - 1
size_t n = 1;
size_t sum = m + n; // 此时 sum 的值不确定,可能会发生数据溢出
修改方法:
根据该规范,需要先校验再求和。对于示例 1,可以在进行加法运算之前,先校验 a + b 是否大于等于 a,如果是,则说明发生了数据溢出,需要进行相应的处理。对于示例 2,可以先校验 SIZE_MAX - m < n 是否成立,如果成立,则说明 m 和 n 相加会超出 size_t 类型的最大值,需要进行相应的处理。
修改后的代码如下:
示例 1:
unsigned int a = 4294967295; // 2^32 - 1
unsigned int b = 1;
if (b > 0 && a + b < a) {
// 发生了数据溢出,进行相应的处理
} else {
unsigned int c = a + b;
}
示例 2:
size_t m = 4294967295; // 2^32 - 1
size_t n = 1;
if (SIZE_MAX - m < n) {
// m 和 n 相加会超出 size_t 类型的最大值,进行相应的处理
} else {
size_t sum = m + n;
}
原文地址: https://www.cveoy.top/t/topic/ohPL 著作权归作者所有。请勿转载和采集!