在C ++中禁用系统调用

时间:2011-05-11 09:33:24

标签: c++ gcc

编译C ++代码时是否可以禁用system calls?如果是的话,我该怎么做?

并稍微扩展这个问题。我希望程序不能与操作系统交互,除了文件读写。有可能这样做吗?

编辑:由于无法与操作系统交互,我的意思是无法在操作系统中进行任何更改,例如创建,编辑或删除某些内容。我主要担心的是系统调用,几乎在所有情况下都是有害的。

这是用于评分程序,我将在其中运行其他人代码。程序通常会解决各种算法问题,因此不需要非常高级的功能。基本(或多或少)STL用法和经典代码。没有外部库(如Boost或类似的东西)或多个文件。

4 个答案:

答案 0 :(得分:3)

是的,这当然是可能的。

查看geordi的源代码,看看它是如何做到的。 Geordi是一个IRC机器人,它在大多数系统调用被禁用的环境下编译,链接和运行C ++代码。

答案 1 :(得分:1)

#define system NO_SYSTEM_CALL

如果你可以使用宏来为编译目的生成错误。

答案 2 :(得分:1)

您可以使用以下任意组合:

  • 使用名为system的虚拟函数创建自己的库,并将其与学生代码链接(假设您控制构建步骤)
  • grep源代码(虽然预处理黑客可以解决这个问题)
  • 在chroot等之后以非特权用户ID运行构建的二进制文件。
  • 使用虚拟机
  • 使用-Dsystem=调用编译器(尽管学生可以#undef
  • (可能 - 必须检查最终用户协议)将其源代码上传到ideone或类似内容并让他们的安全处理此类问题

答案 3 :(得分:0)

程序总是可以在* nix下租用系统调用。然而,您可以查看SELinux,Apparmor,GRsec这是内核安全措施,可以阻止某些应用程序的系统调用。