0

我正在尝试组织一次信号处理编程竞赛;最初它将在 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 代码。

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

4

1 回答 1

0

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

很难静态地检测出程序不会做的事情

*(uint32_t *) 0 = 0xdeadf00d;

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

于 2013-09-17T14:47:03.563 回答