Тестирующая система

Тема в разделе "Общие вопросы по С и С++", создана пользователем -, 2 ноя 2009.

  1. Гость

    Пишу небольшую системку для проверки решений задач учеников. Т.е. ученики посылают в систему файл на паскале/C++/Jav'e, система компилирует и выдает ответ - правильно или нет решена задача (напоминает правила олимпиад по программированию ACM).

    Я знаком с большинством нынешних тестирующий систем, к сожалению они далеки от идеала или же как МГУшная системы ejudje - очень сложна в настройках.

    Поэтому и решено было написать свою.


    На данный момент стоят вопросы:
    1. об определении есть ли в кодже ученика ассемблерная вставка.
    2. как убивать выполняемое решение ученика по истечению определенного промежутка времени, т.е. если программа ученика написано не оптимально и долго работает, то завершать её автоматически и выдавать ответ что превышено время исполнения
    3. Как ограничить программу по памяти, дав ей, к примеру, не более 64Мб.

    На этом моменте я застрял, помогите пожалуйста...
     
  2. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    платформа какая?
     
  3. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    По первому - если у вас есть исходник и известен яп, то в чем пробелема? Не думаю, что сложно найти в файле слова asm..end; и тп.
    По второму - запускаете прогу, запускаете таймер. а TerminateProcess() еще никто не отменял.. Ну или WinExec('taskkill /F /IM имя.exe');
    По третьему - Тут много зависит от яп.. Сходу на чистом АПИ не соображу, тут нужно с HeapSize() поколдовать.
    В целом, ничего сложного.. Читайте msdn вобщем=)
    ПС.
    Не смог удержаться, что бы не поучить учителя=)
     
  4. Гость

    Спасибо большое, только стаж учителя у меня еще меньше года :) Так что учителем меня назвать можно с натяжкой ;)

    И еще вопросик что такое ЯП ???
     
  5. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    ЯП - язык программирования..=) Я имел ввиду, на котором прога пишется=)
     
  6. Гость

    ОС Windows - для компиляции решений
     
  7. zubr

    zubr Гость

    По второму, я бы сделал так:
    1. Запуск процесса, используя функцию CreateProcess
    2. По WaitForSingleObject ждать окончания процесса или выходить по таймауту.
    3. Если выход из WaitForSingleObject по таймауту, то делать TerminateProcess.
    По третьему:
    Вызывать по таймеру функцию GetProcessMemoryInfo, проверять параметр структуры WorkingSetSize, если превышение - делать TerminateProcess.
     
  8. Гость

    Тут же возник еще вопрос:
    Парсинг кода это дело простое. Но что если в файле будет обфусцированный код. Возможно ли скрытие реализации ассемблерных вставок ?

    Если не возможно, то моя задача сводится к парсингу файла и поска в нем зарезервированных слов в зависимости от ЯП ? К примеру для Delphi/Pascla ищу вставки MOV, для GCC ищу __mov__ и т.д. Так ли это ???
     
  9. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    zubr, как всегда прав=)
     
  10. zubr

    zubr Гость

    А что, обфускация исходного кода позволяет скрывать операторы языка?
     
  11. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    Да и вообще, сложно представить студента который несет преподу обфусцированный исходник на проверку.. ЗАЧЕМ??
     
  12. zubr

    zubr Гость

    vital
    А что бы преподу жизнь медом не казалась :)
     
  13. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    zubr, имхо, принести такое преподу - это мазохизм в духе: "Здравствуйте, я хочу что бы меня вздрючили"=)
     
  14. Гость

    Ну дети то сейчас идут очень талантливые, юные хакерыц так и наровят нагадить. Предполагается что дети будут сдавать решения удаленно, т.е. без присутствия учителя.

    Скомпилированное их решение будет запускаться на сервере. Смысл в том чтобы не погубить сервер решением детей :)

    Какие основные моменты надо при этом усмотреть ?
     
  15. zubr

    zubr Гость

    Я бы ограничил действия студенческих программ в пределах определенного каталога (вдруг кто то из них решит почистить диски) и определенной ветки реестра (вдруг кто то из них решит внедрить трояна).
    Для этого можно воспользоваться функциями FindFirstChangeNotification, FindNextChangeNotification, FindCloseChangeNotification, для реестра RegNotifyChangeKeyValue. Еще эффективнее перехват функций обращения к файлам и реестру, так как позволит не просто констатировать произведенное действие программы, и уж потом на него реагировать, а предотвратить нехорошее действие.
     
  16. Гость

    Спасибо за ответ, тут еще возник один интересный вопросик.

    По условию решение ученика читает данные из файла input.txt и пишет в файл output.txt
    Для каждой задачи есть набор тестов. Т.е. скомпилированному решению ученика даются по очереди тесты от 1 до N.
    Есть чекер - программа для проверки данных в выходном файле. Как запустить этот чекер для всех тестов ?

    Напрашивается решение для компиляции решения ученика и копирования в папку с этим решением по очереди файлов input.txt, затем выполнение скомпилированного решения и проверка с помощью чекера.

    Возможно ли обойтись без такого копирования ?
     
  17. zubr

    zubr Гость

    Можно использовать потоки и массивы размеров (если для разных тестов размеры файлов различаются). Или массивы буферов. Каждый буфер - соответствующий ему файл input, output.
     
  18. Гость

    Т.е. мой чекер пораждает процесс, который является скомпилированным решением ученика.

    Не подскажешь куда копать для реализации этого ?
    Даче не знаю как вопрос в гугл или MSDN сформулировать :)
     
  19. zubr

    zubr Гость

    Причем здесь MSDN? Реализация зависит от языка программирования и используемых классов. К примеру, можно использовать стандартную C++ библиотеку CRT Stream, если речь о C++ Builder, то удобно использовать класс TMemoryStream. Алгоритм чекера:
    1. Создать массив int - это массив размеров файлов output
    2. Открыть поток для записи файлов output.
    3. Для каждого файла output читать данные в буфер и записывать их в поток, в массив записывать размер файла.
    Для получения данных очередного файла output:
    1. По индексу массива определяем размер читаемого очередного файла output.
    2. Из текущей позиции потока читаем буфер равный размеру файла.
     
Загрузка...

Поделиться этой страницей