如何在Mac OS上安装C11编译器并包含可选的字符串函数?

问题描述 投票:1回答: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的编译器,它会给我这些额外的(即安全的)字符串函数。

c xcode macos gcc tr24731
2个回答
0
投票

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

也称为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标准的下一版本中删除,或者弃用然后删除。

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

不要使用strncpystrncat等作为“安全”功能,它们不是为此而设计的,它们不是strcpystrcat等的直接替代品,不像strcpy_sstrcat_s,它们是直接替代品。


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

© www.soinside.com 2019 - 2024. All rights reserved.