使用C的子集进行语法检查

时间:2013-04-24 17:42:14

标签: c

我想构建一个基于Web的服务,让用户输入一些C代码,然后服务器将编译并运行并返回结果。我知道,我知道安全噩梦。所以也许我可以使用chroot或lxc或类似的东西。 stackoverflow上有关于这些的好帖子。另一种选择是使用编程竞赛软件。

我正在做的不是用于一般编程目的。用户可以将代码添加到几个存根函数中,就是这样。它们不需要能够使用指针或数组或字符串。它们不应该能够打开/关闭/读/写文件或套接字或共享内存。他们甚至无法创建自己的功能。他们应该只能做以下事情:

// style comments
/* */ style comments
declare variables of type int, double, float, int64_t, int32_t, uint64_t, uint32_t
for, while, do
+, -, *, /, % arithmetic operators ( * as dereference is NOT allowed )
( )
+, - unary operators
++, -- operators
math functions like sin, cos, abs, fabs, etc
a bunch of API functions that will exist
switch, case, break
{ }
if, else, ==, !=
=, +=, -=, *=, /=, etc

是否有一个工具可以用来检查给定的C代码块以确保它只包含那些元素?

如果我找不到现有的解决方案,我可以使用Antlr或类似的东西来自己提出。

1 个答案:

答案 0 :(得分:1)

有关运行用户代码的Web服务的实际示例,请查看Travis CI持续集成服务。开源项目使用它来集中运行单元测试。特拉维斯进程有点像这样:

  • 从已知良好的配置中启动全新 VM。
  • 加载并编译用户代码。
  • 运行测试并显示结果。
  • 弃掉VM。

有一个时间限制(10分钟IIRC),以防止人们在系统上运行僵尸网络,但除此之外,虚拟机功能齐全并连接到互联网。无需限制语法或其他人为限制。

要记住的一点是,无论用户限制多少,您都无法保证服务器不受用户代码的恐怖影响。另一种选择是假设服务器在被用户代码触及的时刻完全毁了,然后将其丢弃,这就是特拉维斯所做的事情。 VM软件通常具有快照功能来帮助这类事情。