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

标签 c

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

不过,我所做的并不是一般的编程目的。用户将能够向一些 stub 函数添加代码,仅此而已。他们不需要能够使用指针、数组或字符串。他们不应该能够打开/关闭/读取/写入文件或套接字或共享内存。他们甚至无法创建自己的功能。他们应该只能执行以下操作:

// 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 或类似的东西自己想出它。

最佳答案

有关运行用户代码的 Web 服务的真实示例,请查看 Travis CI持续集成服务。开源项目使用它以集中方式运行单元测试。 Travis 过程有点像这样:

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

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

要牢记的一点是,无论您对用户施加多少限制,您都永远无法保护服务器免受用户代码的威胁。另一种方法是假设服务器在被用户代码访问时完全崩溃,然后将其丢弃,这就是 Travis 所做的。 VM 软件通常具有快照功能来帮助解决此类问题。

关于c - 使用 C 的子集进行语法检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16198734/

相关文章:

c - GCC错误无限循环

c - 如何使用 MinGW 构建 gstreamer 项目?

c - 在 pty 模式下使用 libssh 的 stderr

c - 在链表中存储结构数组

c - 从不兼容的指针类型警告传递参数

c - C 中字符串数组出现元素重复的问题

c - 函数转换和 C 中函数参数列表的内部表示

c - 如何防止缓冲区溢出/数组溢出?

c - 如何使队列线程安全

c - 为什么代码给出了错误的三角形?