Libchecker:Структура проверяющей программы

From EjudgeWiki
Revision as of 12:35, 3 December 2006 by Cher (talk | contribs)

Библиотека представляет собой каркас (framework), в который вставляются необходимые действия по проверке результата. Библиотека определяет функцию main, то есть при старте проверяющей программы управление получает модуль инициализации библиотеки libchecker.

Вместо функции main проверяющая программа должна определить функцию checker_main с прототипом, таким же как у main. После инициализации библиотеки libchecker будет вызвана функция checker_main основной части кода проверяющей программы. Таким образом, функция checker_main проверяющей программы играет роль функции main обычной программы на C или C++.

Если проверяющая программа сама определяет функцию main и не использует функций и переменных, предоставляемых библиотекой libchecker, такая программа может безопасно линковаться с библиотекой, и библиотека никаким образом не повлияет на работу программы. То есть даже автономные проверяющие программы могут безопасно линковаться с библиотекой libchecker.

Простейший случай проверяющей программы

В самом простом случае проверяющая программа требует входной файл и результат работы тестируемой программы на входном файле. Проверяющая программа сама вычисляет правильный ответ и сравнивает его с ответом, выданным тестируемой программой.

Такая проверяющая программа требует как минимум два аргумента командной строки:

  • argv[1] — имя входного файла
  • argv[2] — имя файла с результатом работы тестируемой программы

Если передаётся большее количество аргументов командной строки, остальные аргументы не используются.

Проверяющая программа тогда может выглядеть примерно следующим образом:

#define NEED_CORR 0
#include "checker.h"
int checker_main(int argc, char **argv)
{
   // checker code is here
   checker_OK();
}

Здесь макроопределение NEED_CORR равное 0 включает простейший режим проверки. Макроопределение NEED_CORR должно обязательно присутствовать в проверяющей программе и находиться перед директивой #include.

Функция checker_main должна либо возвращать значение, соответствующее допустимому коду завершения проверяющей программы, либо завершаться вызовом одной из функций checker_OK, fatal_WA, fatal_PE, fatal_CF, fatal_read. В данном примере функция checker_main завершается вызовом checker_OK. Предполагается, что код проверяющей программы будет при необходимости вызывать другие функции, завершающие работу проверяющей программы.

Использование файлов эталонного ответа

В наиболее типичном случае проверяющая программа кроме входного файла и файла с результатом работы тестируемой программы требует и файл с эталонным ответом. Этот файл не обязательно содержит правильный ответ сам по себе, но может содержать данные, необходимые для проверки правильности ответа.

Такая проверяющая программа требует как минимум три аргумента командной строки:

  • argv[1] — имя входного файла
  • argv[2] — имя файла с результатом работы тестируемой программы
  • argv[3] — имя файла с эталонным ответом

Если передаётся большее количество аргументов командной строки, остальные аргументы не используются.

Чтобы в описании задачи указать, что будет использоваться проверяющая программа этого типа, необходимо использовать конфигурационную переменную use_corr.

Проверяющая программа может выглядеть примерно следующим образом:

#define NEED_CORR 1
#include "checker.h"
int checker_main(int argc, char **argv)
{
   // checker code is here
   checker_OK();
}

Здесь макроопределение NEED_CORR равное 1 включает требуемый режим проверки. Макроопределение NEED_CORR должно обязательно присутствовать в проверяющей программе и находиться перед директивой #include.

Требования к функции checker_main описаны выше.

Использование файлов дополнительной информации о тесте

Использование подготовленного рабочего каталоге

Сочетание режимов использования