为什么遗留strcpy()中没有健全性检查

use*_*748 10 c c++ strcpy

以下是传统系统中最流行的strcpy实现.为什么在开始时没有检查dest和src是否为NULL?我曾经听说过,在过去,记忆力有限,所以短代码总是首选.你现在可以在开始的几天用NULL指针检查实现strcpy和其他类似的函数吗?为什么不?

char *strcpy(char *dest, const char *src)
{
   char *save = dest;
   while(*dest++ = *src++);
   return save;
}
Run Code Online (Sandbox Code Playgroud)

ten*_*our 20

NULL是一个糟糕的指针,但也是如此(char*)0x1.它还应该检查吗?在我看来(我不知道明确的原因),在这种低级操作中进行健全性检查是不必要的.strcpy()是非常基础的,它应该被视为asm指令,如果需要你应该在调用者中进行自己的健全性检查.只是我的2美分:)

  • 用于指出"NULL"的+1只是99.9%指针空间的一个例子,它可能也是无效的. (2认同)

det*_*tly 15

没有健全性检查,因为C最重要的潜在意识形态之一是开发人员提供了理智.当你假设开发人员是理智的时候,你最终会得到一种可以用来做任何事情的语言.

这不是一个明确规定的目标 - 人们很有可能想出一个可以检查这个的实现,甚至更多.也许他们有.但我怀疑许多习惯于C的人会吵着要使用它,因为如果他们的代码有可能被移植到更常见的实现中,他们无论如何都需要进行检查.

  • *......开发人员提供了理智.* - 我喜欢;) (11认同)

Phi*_*ter 11

整个C语言都写着"如果程序员知道他在做什么,我们会正确行事".程序员应该知道他需要做出的所有检查.这不只是检查NULL,它确保dest点到足够分配的内存来保存src,它检查返回值fopen,以确保该文件确实没有成功打开,知道什么时候memcpy是安全的,如果memmove需要,等等.

获取strcpy检查NULL不会改变语言范式.您仍然需要确保dest指向足够的空间 - 这是在不更改界面的情况下strcpy 无法检查的内容.您还需要确保srcis '\0'-terminated,这也是strcpy无法检查的.

有一些C标准库函数,其检查NULL:例如,free(NULL)始终是安全的.但总的来说,C希望你知道你在做什么.

[C++通常会避开<cstring>图书馆而有利于std::string朋友.]


jam*_*lin 6

  1. 通常情况下,库让调用者决定它想要的失败语义通常更好.strcpy如果这两个论点是什么,你会怎么做NULL?默默地什么都不做?失败assert(在非调试版本中不是一个选项)?

  2. 选择加入比选择退出更容易.编写自己的包装器strcpy可以轻松验证输入并使用它.但是,如果图书馆自己这样做了,那么你就没有办法选择不再执行这些检查strcpy.(例如,您可能已经知道您传递给的参数strcpy不是NULL,如果您在紧密循环中调用它或者担心最小化功耗,则可能是您关心的事情.)通常,它更好在给予更多自由方面犯错(即使这种自由带来了额外的责任).