【问题标题】:Are there any C compilers which let you block the usage of specific libraries and functions?是否有任何 C 编译器可以让您阻止特定库和函数的使用?
【发布时间】:2016-09-15 04:23:51
【问题描述】:

有谁知道是否有任何 C 编译器可以让您阻止使用特定的库和函数?

例如,假设我想阻止对 float.h 的访问,并尝试编译具有“#include”的程序。我希望编译失败并显示某种消息表明这是因为 float.h 无法包含。

或者,如果我想阻止对 math.h 中的 sqrt() 和 pow() 的访问,但在该库中包含所有其他函数,那么一个具有“double hold = pow(2.0, 3.0) 行的程序);"不会编译并且会认为正在调用阻塞的函数。

我曾尝试在线搜索类似的内容,但我认为我不知道要搜索的正确术语,因为我似乎找不到任何与我实际要查找的内容相关的结果。

【问题讨论】:

  • 这种功能的用例是什么?您可以随时重新#define 被阻止的功能/类型。
  • 如果您使用的是 GCC,#pragma GCC poison 可用于阻止特定功能。但它对整个标题没有帮助。
  • 我正在尝试编写一个程序来教人们 C 语言。他们输入代码,它将代码传递给编译器并运行它,将输出通过管道传输到一个文件,然后由我的程序读取。我想确保他们不会通过阻止访问某些更危险的功能,并确保它们不能将输出重定向到我想要的其他地方。
  • @Quentin #pragma GCC poison 完全符合我的要求!谢谢昆汀!
  • @PolkaPunk 你最好使用像 Ideone.com 这样的预制产品并为它找到一个 API。

标签: c compilation c-preprocessor


【解决方案1】:

使用例如 gcc,您可以执行以下操作来防止某些包含:

  1. 为您希望失败的每个标头创建一个失败的存根:

float.h:

#error "You must not include me"
  1. 确保这些存根将覆盖您的系统库:

    $ export CPATH=$PWD
    

在此环境中编译尝试包含 "float.h"<float.h> 的 c 文件将失败。

当然,这是可以规避的。您所需要的只是手动声明在缺少的标头中声明的函数。

更好的选择可能是创建一个全局包含 (-include) #pragma GCC poison 所有不应在程序中任何地方使用的符号。

您还可以使用 nm 检查创建的目标文件中是否存在您不希望由 c 库解析的未解析符号,如果找到此类符号则停止构建。

【讨论】:

  • pragma GCC poison 完全符合我的要求!谢谢 PSkocik!
猜你喜欢
  • 1970-01-01
  • 2021-02-16
  • 2011-06-17
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多