沙盒 C 的替代方案,用于具有非常有限约束的编程竞赛



我正在尝试组织一个信号处理的编程竞赛;最初它将在Python中,但是问题出现了,如果我可以将允许的条目扩展到C。

条目所需的编程类型非常有限:

  • 无需标准输入/标准输出
  • 参赛者可以声明 1 个包含状态变量的结构
  • 条目可以声明函数
  • 我将为测试工具创建我自己的受信任的 C 代码,该代码调用参赛者的参赛作品

所以我想知道:如果对允许的计算类型有严格的限制,是否可以通过解析将特定的 C 文件声明为"安全"?我似乎无法弄清楚的一件事是如何轻松防止投射指针或指针算法。

条目将采用以下形式(或多或少):

#include "contest.h"
// includes stdint.h and math.h and some other things
// no "#" signs after this line allowed
typedef struct MyState {
  int16_t somevar;
  int16_t anothervar;
  ...
} MyState_t;
void dosomething(MyState *pstate)
{
  ...
}
void dosomethingelse(MyState *pstate)
{
  ...
}
void calculate_timestep(MyState *pstate, ContestResults *presults)
{
  ...
}

我已经阅读了一些沙盒问题(这个和这个),找到一种方法来沙盒化 C 代码的一部分但允许 C 代码的其他受信任部分看起来有点困难。所以我希望解析能够帮助"祝福"满足某些约束的 C 代码。

有什么建议吗?我真的不在乎它是否卡在无限循环中(如果时间太长,我可以杀死它),但我确实想防止操作系统访问或不需要的内存访问。

如果您还想禁止属于 C 的内容,例如指针、强制转换和指针算术,那么允许 C 是没有意义的。然后,许多有效的C程序变得无法编写,如果你说"你可以使用C",这似乎是违反直觉的。

很难静态地检测程序不会做

*(uint32_t *) 0 = 0xdeadf00d;

这可能会导致主机操作系统出现分段错误。我相信这是可能的,或者已经做出了很好的尝试。这篇维基百科文章列出了您可以调查的 C 和 C++ 静态检查工具。

最新更新