我正在尝试组织一次信号处理编程竞赛;最初它将在 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 代码。
有什么建议吗?我真的不在乎它是否陷入无限循环(如果时间太长,我可以杀死它),但我确实想防止操作系统访问或不需要的内存访问。