[英]Why didn't gcc (or glibc) implement _s functions?
_s 函数,例如scanf_s
, printf_s
似乎是可选标准。 MSVC 已经实现了这些功能,但是 gcc 没有。
不实现安全功能是否有具体原因? glibc 的scanf
是否足够安全?
_s
函数是可选的( C11 标准的附件 K )。 它们被广泛认为“不是很有益”。
在我的问题的答案中,您是否使用 TR-24731“安全”功能? ,您可以找到有关标准规范哪里存在问题的信息,例如标准和 Microsoft 实现之间的关键差异。 TR 24731-1 是 C 标准委员会的技术报告。 该报告几乎是逐字逐句地合并到 C11 标准中作为(可选但“规范性”)附件 K 中的一个额外的以前省略的功能 IIRC。还有用于不同功能集的 TR 24731-2 - 没有_s
后缀. 由于一系列不同的原因,它遇到了阻力。
此外, C 标准委员会提出了一项建议,即在标准的下一次修订中删除这些功能:
那篇论文是对 TR-24731 ( *_s()
) 函数没有被广泛实现的原因的直接而引人注目的阅读。
主要原因包括:
*_s()
函数是不必要的。*_s()
函数或使用它们的代码变得非常困难。有关更多详细信息,请参阅论文。 论文以以下部分结束:
建议的技术勘误表
尽管自最初的提案以来已有十多年的时间,并且自 ISO/IEC TR 24731-1:2007 批准以来已近十年,并且自将边界检查接口引入 C 标准以来已近五年,但没有出现可行的符合性实现. API 继续存在争议,实施者继续拒绝实施请求。
边界检查接口的设计虽然是善意的,但有太多的问题需要纠正。 与依赖既定方法或现代技术相比,使用 API 已被视为导致质量更差、安全性更低的软件。 更有效和更少侵入性的方法已变得司空见惯,并且通常受到用户和安全专家等人的青睐。
因此,我们建议附件 K 要么从 C 标准的下一个修订版中删除,要么弃用然后删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.