【发布时间】:2015-09-02 04:24:16
【问题描述】:
C11 和 C++14 标准已经删除了 gets() 函数,该函数本质上是不安全的并导致安全问题,因为它不执行边界检查导致缓冲区溢出。那么为什么C11 标准不删除strcat() 和strcpy() 函数呢? strcat() 函数不检查第二个字符串是否适合第一个数组。 strcpy() 函数也不包含检查目标数组边界的规定。如果源数组的字符多于目标数组可以容纳的字符怎么办?很可能程序会在运行时崩溃。
那么,如果将这两个不安全的函数从语言中完全删除不是很好吗?为什么它们仍然存在?是什么原因?只有strncat(),strncpy()这样的功能不是很好吗?如果我没记错的话,Microsoft C & C++ 编译器提供了这些函数的安全版本strcpy_s(),strcat_s()。那为什么其他 C 编译器没有正式实现它们以提供安全性呢?
【问题讨论】:
-
我相信 xkcd 用Standards 报道了这个问题,另见
strncpy和strncat。 -
我猜是因为
gets永远不在程序员的控制范围内,而strcpy和strcat可以用在程序员可以控制长度并知道自己在做什么的地方。 -
如果标准是放弃所有可以错误使用的功能,那么剩下的功能就很少了。
-
在这方面,数组在
C中没有绑定检查,使其有点不安全,所以可以从C中删除它吗? :-) -
当我输入“man gets”时,我看到标签“(deprecated)”。当我输入“man strcpy”时,我看不到这样的标签。可能他们只是从标准库中删除了已弃用的函数,因为它们已被声明为弃用。