测试输入缓冲区溢出

时间:2011-02-04 06:34:09

标签: c++

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

int main()
{
    char c[10];

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

2 个答案:

答案 0 :(得分:6)

  

为什么不抛出异常或错误?

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

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

  

您会获得getline的输入吗?

您可以使用std::getline,这可以让您将一行“字符”提取到std::string,或者您可以使用>>并提取到std::string直接对象,具体取决于您想要提取的内容。

答案 1 :(得分:0)

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

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

我偶尔使用我提到的工具/技术来测试我的程序。我还在单元测试中使用了更多的动态分配,以便在使用这些工具运行程序时更容易地暴露故障情况。

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

祝你好运