正如标题所示,C中是否有办法检测此类错误?例如,如果我尝试像int a=b*c+d*e/f;
这样的复杂计算,我可以检测结果是否超出了int
的范围吗?
假设我认为处理此类错误的代价是性能损失,安全隐患以及最坏情况会发生什么?恶意软件作者可以利用此错误吗?
答案 0 :(得分:1)
在更简单的unsigned int
情况下,您可以在乘法之前测试溢出,如下所示
#include <stdio.h>
#include <limits.h>
void multiply(unsigned a, unsigned b)
{
if(UINT_MAX / a >= b)
printf("%u * %u = %u\n", a, b, a * b);
else
printf("%u * %u is out of range\n", a, b);
}
int main(void)
{
multiply(70000, 60000);
multiply(70000, 80000);
return 0;
}
节目输出:
70000 * 60000 = 4200000000
70000 * 80000 is out of range
您可以对int
答案 1 :(得分:1)
实际上,你的第一个问题的答案是否定的。您可以对简单操作进行检查,但对于较大的操作,检查很快就会变得很困难。像int
这样的数据类型和基元只被定义为能够处理有限范围的值。如果您担心溢出,那么简单的答案是使用更大的数据类型(即int64_t
等)。
要回答您的后一个问题,这取决于具体情况。如果航天飞机的导航软件在其计算的右侧部分遇到溢出,它可能会不规则地改变航向并崩溃。我所得到的是技术上任何事情都可能发生,并且很难“完全”安全。对冲您的赌注,并确保使用正确大小的数据类型不会溢出。它有助于找到可能的输入值的边界并将其用作指南,但如果边界不是真正适用,则可以使用可用的最大类型。 uint64_t
可以处理高达1.8446744e + 19的正整数......这是巨大的。