我正在尝试以下代码来查看是否支持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的编译器,它会给我这些额外的(即安全的)字符串函数。
摘要:你不会让它工作。有更好的方法来确保您的代码是正确的。现在,请改用地址清洁剂。
也称为C11标准的“附件K”或TR 24731,这些功能并未广泛实施。唯一可用的实现是Microsoft Visual Studio的一部分,其他常见的C实现已拒绝(明确地,甚至)附件K中的功能。因此,虽然附件K在技术上是标准的一部分,但出于实际目的,它应被视为特定于Microsoft的扩展。
有关更多信息,请参阅Field Experience With Annex K — Bounds Checking Interfaces(文档N1967)。根据这份报告,只有四个附件K的实现,两个用于Windows,一个被认为是“非常不完整”,剩下的一个是“不适合生产使用而没有相当大的变化”。
但是,这些字符串函数“安全”的论点有点误导。这些函数只是添加边界检查,只有在正确调用函数时才有效 - 但是,“非安全”函数只有在正确调用它们时才有效。从上面引用的报告中,
尽管自最初提案已有十多年,自ISO / IEC TR 24731-1:2007批准以来近十年,以及将Bounds检查接口引入C标准近五年,但尚未出现可行的一致性实施。 API继续存在争议,实施请求继续被实施者拒绝。
边界检查界面的设计虽然用心良苦,但却存在太多难以纠正的问题。使用API已被视为导致质量更差,软件安全性低于依赖既定方法或现代技术。更有效和更少侵入性的方法已经变得司空见惯,并且通常受到用户和安全专家的青睐。
因此,我们建议将附件K从C标准的下一版本中删除,或者弃用然后删除。
我建议使用地址消毒剂作为替代方案。
不要使用strncpy
,strncat
等作为“安全”功能,它们不是为此而设计的,它们不是strcpy
,strcat
等的直接替代品,不像strcpy_s
,strcat_s
,它们是直接替代品。
如果您不使用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