【问题标题】:__STDC_LIB_EXT1__ availability in gcc and clang__STDC_LIB_EXT1__ 在 gcc 和 clang 中的可用性
【发布时间】:2018-05-31 17:12:51
【问题描述】:

由于快速谷歌搜索没有找到任何东西,我会尝试在这里询问(因为很多参与 gcc/clang 的人在这里闲逛) - __STDC_LIB_EXT1__ 在 gcc/clang 中的状态是什么?我们正在开发一个跨平台应用程序,我想使用来自<stdio.h> 的一些安全边界检查功能(奇迹般地在 Visual Studio 2017 上可用),但无法使用 Xcode 9.2 编译代码。我假设 Xcode 使用的 clang 版本可能已经过时,但 Ubuntu 上的 gcc 6.3.0 的行为相同。我正在尝试将tmpnam_s 与以下示例一起使用:

#if defined(__STDC_LIB_EXT1__)
#define  __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#else
#error "__STDC_LIB_EXT1__ not defined"
#endif

int main(int argc, char** argv)
{
    char t[L_tmpnam_s]; 
    tmpnam_s(t, L_tmpnam_s);
    return 0;
}

但是编译失败,没有定义宏:

gcc -std=c11 test.c
test.c:5:2: error: #error "__STDC_LIB_EXT1__ not defined"
#error "__STDC_LIB_EXT1__ not defined"
^~~~~

是我做错了什么还是这个功能集的支持很差?

【问题讨论】:

  • 这是,afaik,支持很差。 VS拥有它的唯一原因是因为它几乎来自那里。然而,VS 不支持任何新旧 C 标准,所以这是另一个问题。
  • "安全边界检查",微软开发的功能仅供微软开发人员使用。 C 世界中没有人需要那个,因为那里完全没用。委员会添加这些选项功能是因为微软想要它。与其他功能有冗余,并不比经典功能更安全。
  • 如果你想使用 gcc 和 clang 进行编译和运行时检查,你应该使用-D_FORTIFY_SOURCE=2。这要容易得多,因为 compile 将为您完成这项工作。 blog.quarkslab.com/clang-hardening-cheat-sheet.html
  • @Stargateur 我只是想要可移植的代码。如果使用了不安全的功能,Visual Studio 2017 会抱怨(我可以将其关闭作为最后的手段)。
  • 尽管 MS 提出了这些函数,但它们的实现与最终的 C 标准附录略有不同。因此,即使其他编译器要实现该标准,代码仍然不可移植。禁用警告似乎是最好的主意。

标签: c gcc clang c11 tr24731


【解决方案1】:

对带有_s 后缀的整套“安全”函数的支持很差。 Microsoft 编写了一组带有_s 后缀的函数,并将其提交给 C 标准委员会进行标准化。委员会进行了一些更改(可以说是出于必要),并创建了一份技术报告 TR 24731-1。在 C11 标准 ISO/IEC 9899:2011 中,TR 的一个轻微修改版本作为可选附件 K(规范性)被包含在内。

您可以在Do you use the TR-24731 "safer" functions? 的答案中找到许多肮脏的细节,尤其是在我的answer 中对该问题的注释中,尤其是标准 C 委员会文件N1967 Field Experience with Annex K — Bounds Checking Interfaces 的链接。

我不知道 N1967 提案的当前状态是什么,但它的建议很能说明问题。 N1967 还包含指向支持 Annex K / TR-24731-1 的库的链接——列表有限。

请注意,Microsoft 并未实现 C11 标准指定的库。它实现了标准的近似值,但存在关键差异。如果任何其他系统实现了该标准,这将更重要——但这些功能还没有以任何广泛接受的形式实现(例如,GNU C 库不支持它们)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    相关资源
    最近更新 更多