Подтвердить что ты не робот

Как unit test преднамеренные ошибки компиляции кода шаблона

Обратите внимание, что это НЕ дубликат Как написать unit test для проверки компиляции ошибки?, поскольку меня не интересует проверка правильности внешних библиотек или самого компилятора.

В С++ типично, особенно при работе с шаблонами, использовать методы, которые не позволяют скомпилировать определенный фрагмент кода. Как они могут быть запутаны, каков наилучший способ гарантировать, что отдельные части кода действительно порождают ошибки компилятора?

Поскольку тест не должен даже компилироваться, вы не можете полагаться на такие вещи, как , поэтому я предполагаю, что он должен быть интегрирован в систему сборки? Как обычно возникают эти проблемы?

4b9b3361

Ответ 1

Сделайте это так же, как написаны тесты компилятора. У вас будет немного кода для тестирования на некоторых языках сценариев (shell, perl, tcl и т.д.), Которые будут запускать компилятор по заданным фрагментам кода и проверять, не скомпилированы ли правильные и правильные.

  • gcc использует DejaGnu, который построен поверх expect, который сам построен поверх Tcl.
  • Если вы используете shell script (возможно, DejaGnu, вероятно, слишком переполнен), вы можете посмотреть shUnit2.
  • Perl Test::Harness система должна быть в основном проста в использовании, как есть.
  • В конце концов, это не намного больше работает для запуска процесса с С++, поэтому записывая функцию, чтобы попытаться вызвать компилятор на заданную строку и проверить, выводит ли она ошибку для строки, где вы ожидаете, что это будет не так сложно и вы можете интегрировать его в другие тесты, основанные на boost.test.

Ответ 3

Вам нужно будет полагаться на внешнюю среду для запуска набора тестов компиляции, например. makefiles или hudson jobs, а также проверять наличие выходных данных компилятора или артефактов компилятора. Если компиляция должна завершиться неудачей, не должно быть объектного файла для файла под компиляцией. Я предполагаю, что вы могли бы написать плагин для hudson для этого или простой пакетной версии script, которая запускает make файл, который компилирует все тестовые файлы, которые должны потерпеть неудачу или преуспеть, и соответственно присвоить успех успехам или сбоям.

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

Переход на один уровень глубже, вероятно, означал бы написание расширения компилятора для этого (LLVM может обрабатывать то, что вы просите)