使用C语言的子集进行语法检查
我想构建一个基于web的服务,让用户输入一些C代码,然后服务器将编译、运行并返回结果。我知道,我知道,安全噩梦。也许我可以选择chroot或lxc之类的。在stackoverflow上有关于这些的好帖子。另一种选择是使用编程竞赛软件 不过,我所做的并不是为了一般的编程目的。用户将能够向一些存根函数添加代码,就是这样。他们不需要能够使用指针、数组或字符串。他们不应该能够打开/关闭/读/写文件、套接字或共享内存。他们甚至不能创建自己的函数。他们只能执行以下操作:使用C语言的子集进行语法检查,c,C,我想构建一个基于web的服务,让用户输入一些C代码,然后服务器将编译、运行并返回结果。我知道,我知道,安全噩梦。也许我可以选择chroot或lxc之类的。在stackoverflow上有关于这些的好帖子。另一种选择是使用编程竞赛软件 不过,我所做的并不是为了一般的编程目的。用户将能够向一些存根函数添加代码,就是这样。他们不需要能够使用指针、数组或字符串。他们不应该能够打开/关闭/读/写文件、套接字或共享内存。他们甚至不能创建自己的函数。他们只能执行以下操作: // style comments
// 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流程有点像这样:
- 从已知的良好配置启动全新的虚拟机
- 加载并编译用户代码
- 运行测试并显示结果
- 放弃虚拟机
要记住的一点是,无论您对用户的限制有多大,您都无法保证服务器安全,不受用户代码的恐怖影响。另一种方法是假设服务器在被用户代码触动的那一刻就被完全破坏了,然后就把它扔掉,这就是Travis所做的。虚拟机软件通常有快照功能来帮助实现这类功能。您可能根本不想编译:另一方面,如果您的迷你语言受到限制,为什么要让您的用户受制于35年前极客为极客设计的语法,强调硬件级(非)抽象和词汇精简?这似乎很残酷。我考虑过这一点,但那些人似乎对实现完整的C感兴趣。你知道其中是否有一个只是一小部分吗。无论如何,我不认为它对我有用,因为我需要更快的速度。Python已经成为大学CS课程中事实上的初学者语言。它还可以通过简单地剥离(例如,
os
模块)来提供访问限制。@msw:它是否阻止[t for t in(1)。\uuuuu class\uuuuu base\uuuu[-1]。\uu如果t.\uu name\uuuu==“file'][0]('/etc/passwd')。read()
无法工作?