繁体   English   中英

测试输入的缓冲区溢出

[英]Testing buffer overrun of input

例如,如果我输入的字符大于10,为什么不抛出异常或错误? 您会用getline获得输入吗?

int main()
{
    char c[10];

    while (cin >> c)
    {
        cout << c << endl;
    }
}

为什么不引发异常或错误?

缓冲区溢出是未定义行为的一个示例。 该行为实际上是未定义的:如果您溢出缓冲区,则无法保证程序将执行的操作。 这不会产生异常,因为这样做将需要大量相对昂贵的检查,即使使用正确的代码也是如此,并且在C ++中,总的哲学是您不必为不需要的东西付钱。

如果避免使用原始数组和原始(非智能)指针,并使用C ++标准库容器,字符串和算法,则可以轻松避免大多数情况导致缓冲区溢出。

您会使用getline来获取输入吗?

您可以使用std::getline ,它允许您将字符的“一行”提取到std::string ,也可以使用>>并直接将其提取到std::string对象中,具体取决于什么,您要提取。

有些工具试图揭示这些问题。 valgrind和GuardMalloc就是这样的例子。 同样,msc允许您指定可能暴露此类问题的生成选项。

还要注意,不同的编译器会根据您的程序发出不同的指令,而在优化与否时会发出不同的指令。 这意味着后果可能存在于某些版本中,而可能不存在于其他版本中。

我偶尔会使用我提到的工具/技术来测试我的程序。 我还在单元测试中使用了更多的动态分配,以便在使用这些工具运行程序时更轻松地发现失败的情况。

如果您来自Java或集成了更智能数组的另一种语言,那不是编译器解释c程序的方式,也不是它们在内存中的表示方式。 相反,我们通常在c ++中使用适当的容器。 这些将检测许多这些问题。 例如,如果您尝试访问无效的元素,则可能会抛出std::vector

祝好运

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM