2012-04-30 5 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 /") не будет сразу segfault вашей программы, но это, безусловно, нежелательно.