2013-12-10 26 views
1

我想從用戶那裏獲取C/C++源文件,然後我將在linux中使用gcc命令製作它們的可執行文件。然後我會爲這個可執行文件提供輸入並將輸出重定向到另一個文件。我有一個示例輸出文件,我將檢查生成的輸出以針對錯誤或正確答案做出決定。總而言之,我想讓網上判斷網站。如何製作在線C/C++編譯器?

但我不知道如何處理用戶提供的無限循環問題。就像讓用戶提交了下面的代碼..

while(1){ 

} 

我知道會有很多更多的威脅,但我怎麼處理這些問題。我想知道如何讓網上裁判網站如uva在線裁判或其他人。 如果有人有想法,請幫助我。

+3

如何創建程序運行的最大時間?如果在15秒內沒有完成,強行終止程序。 – abelenky

+3

如果您沒有設定固定的時間限制,無論如何,暫停問題的不確定性都會讓您受到影響。 – bitmask

+0

是的,我想做那樣的事情..但我該怎麼做..請給出一些建議,, @abelenky – user2958359

回答

1

對於代碼判斷網站?這是一種天真的解決方案,但如果您有嚴格的時間限制,則可以使用timeout命令。您只需要安裝它並通過它運行編譯的程序。

+0

可以請你告訴我或提供任何提示,讓過程更有效率。我真的需要這方面的幫助。 – user2958359

+0

超時本身是低開銷和高效,但我的意思是它很天真,因爲有很多其他事情要擔心在運行不受信任的代碼,而不是由超時單獨處理。就像bitmask的答案一樣。超時很可能是更大的解決方案的一部分,並處理您提到的特定情況,但還有其他問題需要解決。 – EPB

+0

好的thanx我知道了 – user2958359

2

看一看here,基本上你要做的就是設置超時時間。如果超時過期,正在執行可執行文件的進程將被終止。

要回應@bitmask,這是完全正確的,安全是一個問題。然而,你可以通過創建一個沙箱並分配好的權限來完成。

1

Timebox it。將編譯生成爲單獨的進程/作業,並在N秒後將其殺死,並向用戶返回適當的錯誤。

4

說實話:不要

如果您在使用timeout時遇到問題,那麼您會爲自己拍攝一個巨大的安全漏洞,因爲所有惡意代碼都可以讓您的服務器執行。我不知道ideone.com的人是如何處理惡意代碼的,但這可能不是微不足道的。

而不是重新發明輪子,只需使用其中一個現有網站或讓您的代碼完整性(如果它是提交某種挑戰)。

即使你在稍後殺死了主進程,也沒有人保證它不能啓動後臺進程並開始(例如)按比例開發比特幣。

+0

是否有任何網站,以便我可以使用他們的編譯器來使我自己的網站? – user2958359

+0

向codepad.org,ideone.com和pastebin.com(按此順序)或Google提供更多服務的人問,但我很懷疑您會找到一個開箱即用的Web編譯器界面。 – bitmask