3

我试图了解有关 C 起源的一些东西,为什么在大多数 SO 问题中不建议使用某些功能。像strtokor strncpy,它们根本不安全。在任何地方,我都会看到建议编写自己的实现。为什么标准不会更改strncpy为例如 BSD strlcpy,而是留下这些“怪物”?

4

4 回答 4

2

C 是 1970 年代初期的产品,它显示了。许多 iffier 库函数是在 C 用户社区非常小且仅限于学术界的时候编写的,其中大多数是有经验的程序员。

到 1989 年发布第一个标准时,这些原始库函数已经在 10 到 15 年的遗留代码中根深蒂固(其中最重要的是 Unix 操作系统及其大部分工具)。负责标准化的委员会不愿破坏现有的代码库,因此这些功能几乎按原样合并到标准中;真正改变的只是将原型语法添加到声明中,并在必要时更改char *void *mallocmemcpymemset)。

AFAIK,自标准化以来实际上只从语言中删除了一个库函数-gets . 一个库调用所造成的混乱比破坏现在近 40 年的遗留代码的前景更可怕。

于 2013-07-22T11:26:37.207 回答
1

有很多遗留的“C”和“C++”代码。如果他们从“C”运行时库中删除所有“不安全”函数,那么许多开发人员升级他们的编译器将是令人望而却步的,因为所有旧代码都无法再构建。

有时他们会给出“已弃用”的编译器消息(MSFT 很喜欢这个),所以你会发现并改用新的、更安全的函数。

当然,新代码应该使用“安全”功能,但我们中的许多人都坚持使用旧编译器和遗留代码来维护:)

于 2013-07-21T20:46:16.227 回答
0

它们仍然存在,因为与仍然使用它们的“旧系统”/“代码”的历史祖先关系 - 即支持“向后兼容性”

建议使用自己的实现,让程序员自己承担风险使用自己的逻辑,因为没有人能比程序员自己更了解他们的环境,例如,strtok 不是线程安全的。

于 2013-07-21T20:40:31.610 回答
-1

这一切都只是教条。使用这些函数,请注意它们与您的目标无关,因为它们可能并非在所有情况下都有效(即 strtok 和多线程),或者他们希望在使用之前/之后捕获条件(即 strncpy 和缺少终止字符) .

于 2013-07-21T21:05:38.063 回答