CodeChef や TechGig などのオンライン ジャッジを作成する予定です。最初は、C/C++ でのみソリューションを受け付けます。
同じセキュリティモデルを考えてみましたが、今のところ私の懸念は、実行とテストの部分をどのようにモデル化するかです。
方法 1
より一般的と思われる方法は、標準入力を実行可能ファイルにリダイレクトし、標準出力をファイルにリダイレクトすることです。次に例を示します。
./submission.exe < input.txt > output.txt
次に、output.txt ファイルを一部の solution.txt ファイルと 1 文字ずつ比較し、結果を報告します。
方法 2
私が見た 2 番目のアプローチは、ユーザーが main() を記述できないようにすることです。代わりに、いくつかの引数を文字列の形式で受け取り、グローバル変数を出力として設定する関数を作成します。例えば:
//This variable should be set before returning from submissionAlgorithm()
char * output;
void submissionAlgorithm(char * input1, char * input2)
{
//Write your code here.
}
各ステップで、テスト ケースを実行するために、関数 submitAlgorithm() が繰り返し呼び出され、出力変数の結果がチェックされます。
最初の分析から、方法 2 は安全であるだけでなく (提出されたコードからファイルシステムへのすべての読み取りおよび書き込みアクセスを防止する)、テスト ケースの実行が高速化される (おそらく?) ことがわかりました。結果はメモリに発生します。
方法 1 が方法 2 よりも優先される理由があるかどうかを知りたいです。
PS: もちろん、オンライン ジャッジ エンジンを Linux サーバーでホストします。