0
char someArray[n];
std::cin >> someArray; // potential buffer overrun

我在我经常光顾的 C++ 论坛上多次看到类似上述的代码。是否有充分的理由不将其视为编译时错误?或者至少是一个警告?

4

2 回答 2

4

C(和 C++)的一个基本前提是编码人员应该知道他们在做什么。否则他们会用 BASIC 编码:-)

不允许出现错误,因为它是根据标准允许的,就像Cgetsscanf("%s")允许的一样,尽管它们是一个等待发生的问题。

您发布的代码糟糕,在严肃的软件中没有位置,但对于“玩具”程序或测试东西来说很好。你只需要意识到它的问题(听起来很像你意识到它们)

于 2012-11-06T02:27:29.773 回答
0

如果 C++ 是一举被发明出来的,它可能根本不存在——如果你想读一个字符串,你必须把它读成 a std::string,这样就结束了。

std::string不幸的是,C++ 在标准化(或根本发明)之前已经使用了很长一段时间。operator>>istream::getline(不要被误认为)都是std::getline在那段时间发明的。当它们被发明时,几乎没有(或没有)真正的替代品,所以他们使用 char 数组。

当然,今天有替代方案,最好避免使用这些替代方案,除非您在使用一些不支持高级替代方案的古老编译器编写代码时遇到困难。

于 2012-11-06T03:02:28.837 回答