可以将 GCC 配置为忽略 #pragma 指令吗?
Posted
技术标签:
【中文标题】可以将 GCC 配置为忽略 #pragma 指令吗?【英文标题】:Can GCC be configured to ignore #pragma directives? 【发布时间】:2019-01-08 22:26:57 【问题描述】:我们正在使用以下编译命令在沙盒环境中编译和运行用户提交的 C++ 程序:
g++ -std=gnu++11 -O2 -o program.exe program.cpp
但是,用户可以使用 pragma 指令覆盖编译标志。例如,可以使用以下代码覆盖优化级别:
#pragma GCC optimize("Ofast")
我们无法控制提交编译的源代码,但我们需要防止编译选项被覆盖。
有没有办法使用 GCC 忽略 pragma 指令?
【问题讨论】:
编译前为什么不能处理源码? @hyde:可能比看起来更难,尤其是考虑到 C99/C++11_Pragma
运算符。
【参考方案1】:
快速浏览一下手册页,答案是“否”,gcc
没有“禁用编译指示”功能。
作为一个真正荒谬的解决方法,您可以简单地要求所有条目完全省略字符串pragma
(对块the _Pragma
operator 也不区分大小写),拒绝任何违反该要求的内容。任何更复杂的东西,本质上都需要编写自己的 C 源代码解析器,我怀疑这是否值得。考虑到您可以使用预处理器玩的令牌连接技巧,甚至不确定这是否会起作用(我正在等待评论展示这种利用)。
【讨论】:
Preprosessor 技巧应该很容易避免,首先运行 preprosessor,然后在编译前过滤/检查 preprosessor 输出(C 代码)。 @hyde:是的。取决于他们的提交系统有多灵活(从他们的问题中听起来不是很灵活,例如他们声称他们根本无法控制源代码)。以上是关于可以将 GCC 配置为忽略 #pragma 指令吗?的主要内容,如果未能解决你的问题,请参考以下文章
编译器处理警告错误 #pragma GCC diagnostic ignored "-Wunused"