我们正在使用以下编译命令在沙盒环境中编译并运行用户提交的C ++程序:
g++ -std=gnu++11 -O2 -o program.exe program.cpp
但是,用户可以使用pragma指令覆盖编译标志。例如,可以使用以下代码覆盖优化级别:
#pragma GCC optimize("Ofast")
我们无法控制提交给编译的源代码,但是我们需要防止覆盖编译选项。
是否可以通过GCC忽略编译指示?
答案 0 :(得分:2)
通过快速浏览手册页,答案为“否”,gcc
没有“禁用实用程序”功能。
作为一个真正荒谬的解决方法,您可能会简单地要求所有条目完全省略字符串pragma
(对块the _Pragma
operator也不区分大小写),拒绝任何违反该要求的内容。从本质上讲,任何复杂的事情都需要编写自己的C源代码解析器,我怀疑是否值得这样做。鉴于您可以使用预处理器进行令牌连接的技巧,我也不十分确定这种方法是否会奏效(我正在等待展示这种漏洞的评论)。