检测C中的算术溢出

时间:2016-01-11 19:44:21

标签: c security debugging

  1. 正如标题所示,C中是否有办法检测此类错误?例如,如果我尝试像int a=b*c+d*e/f;这样的复杂计算,我可以检测结果是否超出了int的范围吗?

  2. 假设我认为处理此类错误的代价是性能损失,安全隐患以及最坏情况会发生什么?恶意软件作者可以利用此错误吗?

2 个答案:

答案 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的正整数......这是巨大的。