我正在尝试组织一个信号处理的编程竞赛;最初它将在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++ 静态检查工具。