【发布时间】:2025-12-31 02:05:12
【问题描述】:
我正在为服务器(使用 C/C++)编写计算量很大的代码。在内部循环中,我需要调用一些外部用户函数,数百万次,因此它们必须在本机上快速运行,并且它们的调用开销不应超过 C 函数调用。每次收到用户函数,源码形式,我会自动编译成二进制,并由主代码动态链接。
这些函数将仅用作简单的数学内核,例如在伪 C 中:
Function f(double x) ->double {
return x * x;
}
或使用数组访问:
Function f(double* ar, int length) ->double {
double sum = 0;
for(i = 0 to length) {
sum = sum + ar[i];
}
return sum;
}
或使用基本的数学库调用:
Function f(double x) ->double {
return cos(x);
}
但是,它们必须对服务器安全。如果他们停止(图灵完备)是可以的,但如果他们访问不属于他们自己的进程内存,如果他们进行系统调用,如果他们导致堆栈溢出,或者概括地说,外部代码“能够破解服务器代码”是不受欢迎的。
所以我的问题是:如果有一种设计安全的语言与 LLVM 前端(没有指针等,具有数组/堆栈的边界检查,系统调用的隔离),没有速度,我正在徘徊我可以使用的惩罚(指主管、垃圾收集器)。 LLVM 不是必需的,但它是首选。
我查看了 Mozilla 的“Rust”,但它似乎不够安全 [rust-dev]。
如果没有这样的语言,我现在的后备选项是使用 NodeJS 沙盒虚拟机。
我相信这样的语言,如果简单的话,是可行的,但它存在吗?
语言类型无关紧要。设计简单且易于证明安全的玩具语言就可以了。
编辑:关于系统调用和有害的依赖关系,对于任何语言,用普通的 bash 隔离它们应该很容易。只需尝试将生成的 .bc 与没有库的链接。如果失败,.bc 有依赖关系,所以放弃它。由于 LLVM IR 在其他方面完全无害,因此该语言唯一应该保证的是内存访问。
【问题讨论】:
-
非常有趣的问题。不过,这里可能是题外话,因为它要求指向场外资源的指针。
-
你考虑过 PNaCl 吗?
-
@500-InternalServerError 感谢您的评论。我认为它会提供信息,但规则仍然不完全是我的情况,因为我问的是一些不太常见的东西的存在。
-
@EliBendersky 是的,我不知何故跳过了它,尽管从我读到的内容中假设它可能会增加一些复杂性、主管,以及每次调用该方法时可能会增加一些(昂贵的?)开销.然而,这只是我的印象,因为我没有找到足够的资源。
-
这听起来完全符合您的要求 - 我建议您阅读更多相关信息。从这里开始:developer.chrome.com/native-client/nacl-and-pnacl