例如,如果我输入大于10的字符,为什么不抛出异常或错误? 你会用getline得到输入吗?
int main()
{
char c[10];
while (cin >> c)
{
cout << c << endl;
}
}
答案 0 :(得分:6)
为什么不抛出异常或错误?
缓冲区溢出是未定义行为的一个示例。行为实际上是未定义的:如果溢出缓冲区,则无法保证程序将执行的操作。这不会产生异常,因为即使在正确的代码中这样做也需要大量相对昂贵的检查,而在C ++中,一般的理念是你不需要支付你不需要的东西。
如果您避免使用原始数组和原始(非智能)指针并使用C ++标准库容器,字符串和算法,则可以轻松避免大多数情况导致缓冲区溢出。
您会获得
getline
的输入吗?
您可以使用std::getline
,这可以让您将一行“字符”提取到std::string
,或者您可以使用>>
并提取到std::string
直接对象,具体取决于您想要提取的内容。
答案 1 :(得分:0)
有些工具试图揭露这些问题。 valgrind和GuardMalloc就是这样的例子。同样,msc允许您指定可以暴露此类问题的构建选项。
另请注意,不同的编译器根据您的程序发出不同的指令,并在优化与否时发出不同的指令。这意味着后果可能存在于某些版本中,而在其他版本中可能不存在。
我偶尔使用我提到的工具/技术来测试我的程序。我还在单元测试中使用了更多的动态分配,以便在使用这些工具运行程序时更容易地暴露故障情况。
如果您来自java或其他集成了更智能数组的语言:这不是编译器如何解释c程序,也不是它们在内存中的表示方式。相反,我们通常在c ++中使用适当的容器。这些将检测到许多这些问题。例如,如果您尝试访问无效元素,则可能会抛出std::vector
。