细粒沙盒

时间:2009-10-12 18:12:52

标签: virtual language-design sandbox functional-programming

场景:在像Java或Python这样的字节码虚拟机中运行的程序想要评估(通过动态编译到字节代码然后运行)一个函数,其代码是从外部自动生成或提供的。

棘手的一点是函数的代码不受信任 - 它可能是由遗传编程等随机方法生成的,甚至是由对手提供的。因此,需要强制它表现为纯函数 - 它可以返回一个值,但它可能没有任何副作用,即它可能不会以任何方式改变任何程序的现有数据。

另一个棘手的问题是该函数可能需要调用程序的一些现有函数;其中一些功能可能有副作用,但只要它们被可疑功能调用,就应该防止它们实际产生任何持久影响。

此外,优选的是,不对可疑功能的编码风格进行约束,例如,它可以自由地对它自己创建的任何数据结构执行破坏性更新,只需要它的整体效果是纯粹的功能。

此外,优选的是,该解决方案具有相当低的开销,因为这可能需要进行数十亿次;例如,为了避免为每个这样的函数分叉一个全新的虚拟机会更好。

这不一定必须在Java或Python等现有虚拟机中可行;如果有必要围绕这个用例设计虚拟机,那就这样吧。

是否有任何已知的解决方案(或非解决方案,即已知无法解决的问题)?

3 个答案:

答案 0 :(得分:1)

我认为沙盒是你唯一的选择。试图分析程序并确定它是否安全是一个等同的停止问题。 CLR内置了安全性,允许这样的限制,我想Java有类似的限制。我不认为Python会这样做。

答案 1 :(得分:1)

嗯,一般问题似乎是不可解决的:没有一种终止策略可以从可能无状态的方法中对本质上有状态的计算进行排序。除非特别构造字节代码以提供克服此类所需的强类型约束,否则您将迷失方向。 Curien已经写了很多关于什么样的事情可以从黑匣子观察中推断出来。

但是如果你愿意向你的功能提供者提出更多要求,那么问题就是要求提供携带证明的代码(PCC)作为答案。我猜你知道Necula的工作,Necula特别关注确保汇编代码遵守内存使用限制,例如不篡改超出范围的状态;你可能不知道在相当常见的情况下自动推断证据的工作:PCC可能比你想象的更容易。

答案 2 :(得分:1)

我和其他许多人之前已经为遗传编程目的构建了语言。如果构建新语言是一种选择,那么这种解决方案已经存在。由于存在自动函数生成技术,因此提供函数库应该是微不足道的。该系统实际上将构成沙盒环境。这些功能的任何副作用都将限于程序可访问的空间。