C ++ тестирование на ошибки компиляции - PullRequest
3 голосов
/ 29 марта 2012

Я студент, и я пытаюсь написать и запустить некоторый тестовый код для назначения, чтобы проверить его, прежде чем включить его. Сейчас я пытаюсь проверить, что мой код правильно предотвращает семантику значений,В своем назначении я объявил для каждого из своих классов свой собственный приватный конструктор копирования и оператор присваивания, которые не имеют определения и поэтому ничего не делают.Когда они вызываются в моей тестовой программе, я получаю ошибки компиляции, как я и ожидал.Примерно так:

ошибка: 'myClass :: myClass (const & myClass)' закрыта '

ошибка:' myClass & myClass :: operator = (const myClass &) 'закрыта

Есть ли способ использовать try / catch, чтобы мой тестовый код компилировался и выполнялся, но покажите мне, что эти ошибки произошли?Я пробовал:

myClass obj1(...);
myClass obj2(...);
try{
  obj1 = obj2;
  throw 1;
}
catch(int e){
  assert(e==1);
}

, но компилятор все еще выдает мне вышеуказанные ошибки.Разве это не «исключения»?Разве они не вызовут бросок?

Если я правильно понимаю try / catch, он обрабатывает ошибки времени выполнения, а не те ошибки, которые я получал выше, верно?

После проведения дополнительных исследований кажется, что нет(простой) способ тестирования некоторых ошибок компиляции изначально в C ++ (это может быть верно для большинства языков, теперь, когда я думаю об этом).Я прочитал публикацию , в которой предлагается написание некоторого тестового кода на языке сценариев, который пытается скомпилировать фрагменты кода C ++ и проверять наличие ошибок, и еще одну публикацию , которая рекомендует использовать Boost.Build.

Какой самый простой / лучший способ сделать то, что я пытаюсь сделать?

Я посмотрел документацию для Boost.Build, и это немного над моей головой.Если бы я использовал его, как бы я протестировал этот файл, скажем, «test.cpp», скомпилировал, и, возможно, обработал бы определенные ошибки компиляции, которые происходят с «test.cpp»? *

Спасибо за вашу помощь!

PS Это один из моих первых постов, надеюсь, я провел «достаточно» исследование и сделал все остальное правильно.Извините, если я не сделал.

Ответы [ 4 ]

3 голосов
/ 29 марта 2012

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

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

Однако я не вижу цели в этом. Всегда предпочитайте ошибку времени компиляции ошибке времени выполнения. Всегда.

Стандарт C ++ определяет, что является допустимым или недействительным кодом, при этом некоторые вещи остаются неопределенными, а другие остаются на усмотрение тех, кто реализует компилятор. Любой совместимый со стандартом компилятор C ++ выдаст ошибку, потому что что-то не соответствует стандарту / определению и, таким образом, является недействительным. Обычно ошибки заключаются в том, что что-то неоднозначное или совершенно бессмысленное, и вам нужно пересмотреть написанное.

Ошибки во время выполнения - это либо сбои, либо поведение, которое является непреднамеренным и нежелательным с точки зрения пользователя. Ошибки компилятора - это то, что компилятор говорит: «Я не понимаю, что вы говорите. Это не имеет смысла». Предупреждения компилятора - это то, что компилятор говорит: «Я позволю вам сделать это, но я, вероятно, не должен.

3 голосов
/ 29 марта 2012

try-catch происходит во время выполнения, тогда как компилятор статически пытается связать функции, которые вы вызываете во время компиляции, поэтому компиляция всегда будет неудачной.

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

1 голос
/ 03 ноября 2015

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

В вашем тестовом файле введите #include <type_traits>

и затем добавьте

assert((std::is_assignable <myClass, myClass> ::value) == FALSE);
assert((std::is_copy_assignable<myClass> ::value) == FALSE);
assert((std::is_copy_constructible<myClass> ::value) == FALSE);

Различные черты, которые вы можете проверить, документированы здесь: http://en.cppreference.com/w/cpp/types

Обратите внимание, вам придется скомпилировать C ++ 11, чтобы использовать большинство этих функций.

(как описано сначала в Утверждение, что код НЕ компилируется )

0 голосов
/ 29 марта 2012

Этот тип ошибок компиляции не может быть подавлен.Они являются ошибками с точки зрения стандартов C ++.

Конечно, вы можете подавить некоторые из них в вашем собственном (или исправленном) компиляторе.

...