【问题标题】:Can I prohibit certain functions from crashing a program?我可以禁止某些功能使程序崩溃吗?
【发布时间】:2012-04-30 15:22:48
【问题描述】:

我想做一个交互式代码学习系统,它允许用户,(通常是年轻程序员)用c++语言编写一个函数的内容,发送到服务器,在那里它将被编译成动态库并从主程序调用。

程序期望函数根据给定的参数返回正确的答案。

当然,会有一些孩子,这会导致像分段错误这样的错误。 (服务器由 Linux 驱动)。

那么,我可以制作退出函数的信号处理程序吗?

我希望完成的事情:

for (int i = 0; i < PLAYER_NUM; i++) {
    snprintf(buf, sizeof(buf), "players/%s.so", player[i]);
    handle = dlopen(buf, RTLD_LAZY);
    add[i] = (int (*)(int, int))dlsym(handle, "sum");
} // that was simply loading of functions from libraries.

for (int x = 0; x < 10; x++)
    for (int i = 0; i < PLAYER_NUM; i++) {
        if(failed[i]) continue;
        ret = add[i](x, 5);

    if(sigfault_received() || res != (x + 5)) {
        failed[i] = true;
    }
}

【问题讨论】:

  • 你所能做的就是忍受它会崩溃的事实,并找出方法来 1) 确保它不会损坏系统的其余部分,以及 2) 恢复当(不是如果)它发生时,快速而轻松地。我的第一反应是在虚拟机中运行他们的代码。
  • 添加了“沙盒”标签,因为这是此类保护的通用名称。

标签: c++ c segmentation-fault sandbox dynamic-library


【解决方案1】:

错误代码会导致各种可能无法恢复的问题。所以处理 SIGSEGV 并没有真正的帮助。

解决方案是在单独的进程中运行该代码,并使用 IPC、管道或套接字与主进程通信。

【讨论】:

  • 年幼的孩子学习如何编程不应该担心像 IPC 这样的高级主题。干净利落地隐藏 IPC 的好方法是什么?
  • 你的程序很可能有一些他们会使用的API——让这些函数与你的主程序通信,或者告诉他们不要关心这些函数的实现,或者只是给他们目标文件可以链接。
【解决方案2】:

使用适当的沙箱,而不是您自己构建的沙箱。不能指望你像 10 个孩子一起预测恶作剧。例如。 system("rm -rf /") 不会立即对您的程序进行段错误,但这肯定是不可取的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多