2012-04-30 68 views
2

我想做一個交互式的代碼學習系統,它允許用戶(通常是年輕的程序員)用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; 
    } 
} 
+3

關於你所能做的就是忍受它將要崩潰的事實,並找出方法1)確保它不會在系統的其他部分損壞系統的其餘部分,並且2)當(如果)發生。我的直接反應是在虛擬機中運行他們的代碼。 –

+0

添加了「沙箱」標籤,因爲這是此類保護的通用名稱。 – MSalters

回答

10

故障代碼可能導致各種可能無法恢復的問題。所以處理SIGSEGV不會真的有幫助。

解決方案是在單獨的進程中運行該代碼,並使用IPC,管道或套接字與主進程進行通信。

+0

年輕的孩子學習如何編程不應該擔心像IPC這樣的高級話題。乾淨地隱藏IPC的好方法是什麼? – TJD

+0

你的程序很可能有一些他們將使用的API--使這些功能與你的主程序進行通信,或者告訴他們不要關心這些功能的實現,或者只給它們可以鏈接的對象文件。 – ThiefMaster

0

使用合適的沙箱,而不是你自己建造的沙箱。你不能期望像10個孩子一樣有創意地預測惡作劇。例如。 system("rm -rf /")不會立即段錯誤您的程序,但它肯定是不受歡迎的。

相關問題