Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
#1

Ошибка компиляции как положительный результат - C++

09.08.2012, 19:45. Просмотров 1819. Ответов 20

Товарищи, подскажите, пожалуйста, есть ли возможность средствами плюсов следить за ошибками компиляции?

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

Если средствами плюсов такое сделать не получится (что вероятнее всего), то как можно попроще это реализовать внешними инструментами?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2012, 19:45     Ошибка компиляции как положительный результат
Посмотрите здесь:
C++ Результат компиляции
C++ Антивирус Касперского считает зараженным результат компиляции
Каким будет результат компиляции и выполнения данного кода? C++
C++ Каким будет результат компиляции и выполнения данного кода?
Почему результат компиляции маленькой программы на с++ имеет довольно большой размер? C++
C++ Ошибка при компиляции. Как правильно создавать класс с объектами от другого класса?
Ошибка при компиляции. Где ошибка? (Работа с классом) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,934
Записей в блоге: 26
09.08.2012, 22:59     Ошибка компиляции как положительный результат #2
А можешь более конкретный и живой пример привести? Просто для наглядного понимания того, что же ты хочешь
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
09.08.2012, 23:06  [ТС]     Ошибка компиляции как положительный результат #3
Например, я в какой-нибудь функции пишу:
C++
1
    static_assert(false, "Ура, произошла ошибка.");
Вот на этой строке я хочу эту ошибку поймать, удостовериться, что она есть, подавить её, пойти компилировать дальше и достигнуть успешной компиляции.
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,934
Записей в блоге: 26
09.08.2012, 23:09     Ошибка компиляции как положительный результат #4
Цитата Сообщение от volovzi Посмотреть сообщение
Вот на этой строке я хочу эту ошибку поймать, удостовериться, что она есть, подавить её
Вот здесь хоть как-нибудь внятно поясни, что ты подразумеваешь и на кой хер оно вообще надо. И поставь задачу целиком, потому что по твоей постановке вопроса проще всего ответить "никак", но есть подозрение, что ты просто неправильно к проектированию программы подходишь
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
09.08.2012, 23:49  [ТС]     Ошибка компиляции как положительный результат #5
Я правильно подхожу .
Объясню подробнее. Я пишу библиотеку метафункций https://github.com/izvolov/Meta.
В ней есть метафункция, которая извлекает из шаблонного типа нужный тип по индексу: https://github.com/izvolov/Meta/blob.../access/at.hpp

Теперь я пишу тест для этой метафункции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main ()
{
    typedef std::tuple<std::string, double, char> tuple;
    
    typedef meta::at<tuple, 0>::type zero_type;
    static_assert(std::is_same<std::string, zero_type>::value, "Типы не совпали.");
    
    typedef meta::at<tuple, 1>::type first_type;
    static_assert(std::is_same<double, first_type>::value, "Типы не совпали.");
    
    typedef meta::at<tuple, -1>::type error1;
    typedef meta::at<tuple, 3>::type error2;
}
В строках 11 и 12 произойдут ошибки компиляции, поскольку в первом случае происходит попытка доступа по отрицательному индексу, а во втором — выход за рамки возможных индексов.
Я жду этих ошибок, то есть я хочу, чтобы они произошли. Если они не произошли, то это значит, что тест не пройден. И наоборот, если они произошли, то всё в порядке.

И в итоге я хочу, чтобы если тест пройден успешно, компиляция завершалась успешно, а если тест не пройден, выдавалось бы соответствующее сообщение.
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,934
Записей в блоге: 26
10.08.2012, 00:05     Ошибка компиляции как положительный результат #6
Постановка задачи примерно понятна. А с какой целью у тебя написаны строки 11 и 12? С целью тестирования твоей реализации (т.е. весь пример - это не боевая программа, а тестовый пример)?

Добавлено через 55 секунд
Другими словами, то, что называют "негативный тест"?
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.08.2012, 00:11  [ТС]     Ошибка компиляции как положительный результат #7
Да, получается так. Негативный тест.
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,934
Записей в блоге: 26
10.08.2012, 00:20     Ошибка компиляции как положительный результат #8
Тогда так, как ты хочешь, сделать нельзя. В таких случаях надо на каждый случай писать один тест. Ну или всё в одном тестовом файле развести под макросами.

Попробую на примере показать. Допустим, я разработчик компилятора gcc. Мне нужно написать тестовые примеры на то, что компилятор правильно работает с описанием массива и допускает только описание массива с константной положительной величиной. Мне нужно проверить "плохие" случаи: массив с размерностью ноль, массив с отрицательной размерностью, массив с неконстантной размерностью. Я напишу тест, по результату исполнения которого компилятор выдаст ошибку. Но компилятор может выдать ошибку и по другому поводу, а потому я для контроля добавлю ещё один "хороший" случай, чтобы убедиться, что тест написан правильно, что компилятор не поломался по другим причинам и т.п.

C
/* Значение макроса TEST подаётся снаружи */
 
#if TEST == 0
 
  /* Хороший случай */
  #define N 5
 
#elif TEST == 1
 
  #define N 0
 
#elif TEST == 2
 
  #define N -1
 
#elif TEST == 3
 
  int var;
  #define N var
 
#else
 
  #error "Некорректное значение TEST"
 
#endif
 
int arr[N];
далее в скрипте осуществил бы последовательность запусков

Bash
$ gcc -c t.c -DTEST=0
$ gcc -c t.c -DTEST=1
$ gcc -c t.c -DTEST=2
$ gcc -c t.c -DTEST=3
Первый запуск должен отработать успешно, все остальные - упасть при компиляции
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
10.08.2012, 00:20     Ошибка компиляции как положительный результат #9
volovzi, в boost::mpl есть похожие на это проверки типов
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,934
Записей в блоге: 26
10.08.2012, 00:20     Ошибка компиляции как положительный результат #10
Более сложный (но более качественный) запуск ещё бы и анализировал выдачу компилятора (что диагностика именно та, которая ожидалась)
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.08.2012, 00:28  [ТС]     Ошибка компиляции как положительный результат #11
Evg, спасибо, буду думать.


alex_x_x, ссылочку, пожалуйста.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
10.08.2012, 00:30     Ошибка компиляции как положительный результат #12
C++
1
2
BOOST_MPL_ASSERT(( is_same< v1,unsigned > ));
BOOST_MPL_ASSERT(( is_same< v2,pair<int,unsigned> > ));
http://www.boost.org/doc/libs/1_50_0...al/assert.html
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.08.2012, 00:38  [ТС]     Ошибка компиляции как положительный результат #13
alex_x_x, отлично. А как это относится к теме?
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
10.08.2012, 00:41     Ошибка компиляции как положительный результат #14
ну ок, не вчитывался
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2012, 01:14     Ошибка компиляции как положительный результат
Еще ссылки по теме:
Наименьший положительный элемент (0 не положительный) C++
При компиляции ошибка. Ошибка c++ C2678 C++
Ошибка компиляции C++
Ошибка компиляции C++
C++ Ошибка компиляции

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.08.2012, 01:14  [ТС]     Ошибка компиляции как положительный результат #15
Ну да, видимо, придётся писать скрипты на баше, которые будут сначала генерировать плюсовый код, а потом несколько раз компилировать его с разными значениями макроса.
Yandex
Объявления
10.08.2012, 01:14     Ошибка компиляции как положительный результат
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru