2

我正在尝试下面的代码来查看是否支持 C 中的可选字符串函数(我已经安装了 Mac OS X El Capitan 和 XCode)......

#include <stdio.h>

int main(void)
{
  #if defined __STDC_LIB_EXT1__
    printf("Optional functions are defined.\n");
  #else
    printf("Optional functions are not defined.\n");
  #endif

  return 0;
}

...但它表明他们不是。

我已经尝试了 XCode 中的所有不同编译器(cc、gcc、llvm-gcc、clang)。

我也尝试过brew install gcc假设 GNU C 编译器会给我这些额外的功能,但事实并非如此。

有没有办法在 Mac OS 上简单地安装一个兼容 C11 的编译器,它会给我这些额外的(即安全的)字符串函数。

4

2 回答 2

0

摘要:你不会让它工作。有更好的方法来确保您的代码是正确的。现在,请改用地址清理程序。

也称为 C11 标准或 TR 24731 的“附件 K”,这些功能并未得到广泛实施。唯一常用的实现是 Microsoft Visual Studio 的一部分,其他常见的 C 实现已经拒绝(明确地,甚至)附件 K 中的功能。因此,虽然附件 K 在技术上是标准的一部分,但出于实际目的,它应该被视为Microsoft 特定的扩展。

有关更多信息,请参阅附件 K 的现场经验 — 边界检查接口(文档 N1967)。根据这份报告,附件 K 的实现只有四种,两种用于 Windows,一种被认为“非常不完整”,剩下的一种“不适合生产使用而无需进行重大更改”。

然而,这些字符串函数是“安全的”的说法有点误导。这些函数只是添加了边界检查,这只有在函数被正确调用的情况下才有效——但话说回来,“非安全”函数也只有在它们被正确调用的情况下才有效。从上面引用的报告中,

尽管距离最初的提议已有十多年,距离 ISO/IEC TR 24731-1:2007 的批准已有近十年,距离将边界检查接口引入 C 标准已有近五年,但没有出现可行的符合要求的实现. API 继续存在争议,实施请求继续被实施者拒绝。

Bounds 检查接口的设计虽然是出于好意,但存在太多需要纠正的问题。与依赖现有方法或现代技术相比,使用 API 会导致软件质量更差、安全性更低。更有效、侵入性更小的方法已变得司空见惯,并且经常受到用户和安全专家的青睐。

因此,我们建议附录 K 要么从 C 标准的下一个修订版中删除,要么弃用然后删除。

我建议使用地址消毒剂作为替代方案。

不要将strncpy,strncat等用作“安全”功能,它们并非设计用于执行此操作,并且它们不是, 等的直接替代品,与 , 不同strcpy的是,它们是直接替代品。strcatstrcpy_sstrcat_s

于 2016-11-28T08:12:51.580 回答
0

如果您不使用 Windows 或 Embarcadero,则需要使用外部 safeclib:https ://github.com/rurban/safeclib/releases

没有其他 libc 带有安全的 C11 Annex K 扩展。有关与此有关的各种 libc 怪癖的概述,请参阅https://rurban.github.io/safeclib/doc/safec-3.3/d1/dae/md_doc_libc-overview.html

于 2018-09-02T07:47:00.737 回答