Модульное тестирование на ошибки компилятора - PullRequest
7 голосов
/ 14 июля 2009

Как вы проверяете наличие ошибок компиляции в модульном тестировании?

Рассмотрим код:

class ErrorTest
{
    OtherClass& read_write() {
        return other;
    }

    const OtherClass& read_only() const {
        return other;
    }

    private:
        OtherClass other;
};

Как я могу проверить назначение read_only ()? Это действительно важно и должно быть тщательно проверено, чтобы правильно генерировать ошибки компилятора:

ErrorTest test;
OtherClass other = test.read_only();
test.read_write() = other.modify();
test.read_only() = other.modify(); /* This should error */

Ответы [ 4 ]

1 голос
/ 14 июля 2009

Это похоже на автоматическое обнаружение, которое происходит, когда вы «./configure» для сборки из исходного кода на * nix-машине. Скрипты autoconf создают небольшие программы и пытаются скомпилировать их, чтобы определить, что доступно и поддерживается вашим компилятором.

Возможно, повторное использование нецелесообразно, но вам может понадобиться та же модель. Каждый тест будет иметь свой собственный файл или набор файлов и отдельный файл проекта / make target / etc. Затем ваш тестовый скрипт попытается выполнить каждый тестовый случай и проверить, произошла ли ожидаемая ошибка, либо с помощью grep, либо путем сравнения вывод на базовый вывод, сохраненный с контрольными примерами.

1 голос
/ 14 июля 2009

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

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

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

Немного более простой подход может заключаться в том, чтобы хранить каталог с плохим кодом и иметь скрипт, компилирующий каждый файл по одному. Имейте флаг '#ifdef MAKEFAIL', который включает точное условие, которое должно произойти. Убедитесь, что компилятор возвращает 0, если вы не устанавливаете этот флаг, и ненулевой, когда вы делаете. Это предполагает, что компилятор возвращает ненулевое значение при ошибке ... Я не знаю, следует ли MSVC этому правилу.

Третий вариант, который я выброшу для решения переносимости, это autoconf. Это может быть неудобно для установки, но часть его цели состояла в том, чтобы гарантировать, что у вас есть нормальная среда разработки перед компиляцией. Вы могли бы добавить в него такой тест, который позволил бы найти компилятор и попробовать его.

0 голосов
/ 19 декабря 2018

В C ++ 11 вы можете использовать

std::is_const< decltype( std::declval<ErrorTest>().read_only() ) >::value

чтобы узнать во время компиляции (или во время выполнения, как вы хотите), является ли этот тип возврата константным.

0 голосов
/ 14 июля 2009

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

Но для этого случая вам действительно нужен инструмент статического анализа, который проверяет, чтобы код, который пишут ваши разработчики, соответствовал соглашениям, таким как этот. Это, безусловно, действительный инструмент для сборки. Однако поиск инструмента статического анализа для определения того, что вы здесь указываете, может быть затруднительным. Я бы начал со статьи в Википедии Список инструментов для статического анализа кода , в разделе C / C ++ .

Обратите внимание, что код, который вы написали, не является "ошибкой", это просто ваше соглашение. Это очень хорошее соглашение, но компилятор не ограничивает и не должен ограничивать вас этим соглашением. И не должен инструмент статического анализа. Поэтому вам нужно найти тот, который позволит вам настроить то, что допустимо, а что нет.

...