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

C++

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

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

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

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

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

Если средствами плюсов такое сделать не получится (что вероятнее всего), то как можно попроще это реализовать внешними инструментами?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2012, 19:45     Ошибка компиляции как положительный результат
Посмотрите здесь:

C++ Ошибка компиляции
C++ Результат компиляции
C++ С++ Ошибка компиляции
C++ Ошибка компиляции
ошибка компиляции C++
Наименьший положительный элемент (0 не положительный) C++
Ошибка компиляции C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17389 / 5627 / 351
Регистрация: 30.03.2009
Сообщений: 15,410
Записей в блоге: 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
17389 / 5627 / 351
Регистрация: 30.03.2009
Сообщений: 15,410
Записей в блоге: 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
17389 / 5627 / 351
Регистрация: 30.03.2009
Сообщений: 15,410
Записей в блоге: 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
17389 / 5627 / 351
Регистрация: 30.03.2009
Сообщений: 15,410
Записей в блоге: 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
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
10.08.2012, 00:20     Ошибка компиляции как положительный результат #9
volovzi, в boost::mpl есть похожие на это проверки типов
Evg
Эксперт CАвтор FAQ
17389 / 5627 / 351
Регистрация: 30.03.2009
Сообщений: 15,410
Записей в блоге: 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
бжни
2445 / 1650 / 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
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
10.08.2012, 00:41     Ошибка компиляции как положительный результат #14
ну ок, не вчитывался
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.08.2012, 01:14  [ТС]     Ошибка компиляции как положительный результат #15
Ну да, видимо, придётся писать скрипты на баше, которые будут сначала генерировать плюсовый код, а потом несколько раз компилировать его с разными значениями макроса.
Evg
Эксперт CАвтор FAQ
17389 / 5627 / 351
Регистрация: 30.03.2009
Сообщений: 15,410
Записей в блоге: 26
10.08.2012, 08:31     Ошибка компиляции как положительный результат #16
Цитата Сообщение от volovzi Посмотреть сообщение
Ну да, видимо, придётся писать скрипты на баше, которые будут сначала генерировать плюсовый код, а потом несколько раз компилировать его с разными значениями макроса.
gnu'шники используют некоторую наноутилиту dejagnu. Она предназначена для того, чтобы компилировать и исполнять разнородные тесты, используя только один пусковой скрипт. Я никогда ею не пользовался, но сводится оно примерно к следующему. В текст программы вносятся комментарии, внутри которых на птичьем языке вводятся команды для dejagnu, по которым он понимает, с какими опциями надо компилировать программу, с какими аргументами запускать, что она должна печатать. Почитай к ней описание, может и для твоего случая можно будет её применить.

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

C
/* { dg-flags "-DQQQ" } */
/* { dg-args "-arg1 -arg2" } */
/* { dg-output "abc" } */
/* { dg-output "def" } */
 
#ifndef QQQ
#error "qqq"
#endif
 
int main (int argc, char **argv)
{
  while (argv != NULL)
    {
      if ( !strcmp (argv, "-arg1"))
        printf ("abc\n");
      else if ( !strcmp (argv, "-arg2"))
        printf ("def\n");
 
      argv++;
    }
}
Если отдать утилите dejagnu этот тест, то она скомпилирует его при помощи опции -DQQQ, далее запустит его с аргументами "-arg1 -arg2" и по окончании проверит, что скрипт напечатал на экран "abc\ndef\n".
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.08.2012, 14:03  [ТС]     Ошибка компиляции как положительный результат #17
Evg, насколько я понимаю, эта утилита всё-таки предназначена для запуска тестов. А мне запуск вообще не требуется, меня интересует только компиляция, и то в половине случаев меня интересует падение при компиляции .
Но спасибо за информацию.
Evg
Эксперт CАвтор FAQ
17389 / 5627 / 351
Регистрация: 30.03.2009
Сообщений: 15,410
Записей в блоге: 26
10.08.2012, 14:57     Ошибка компиляции как положительный результат #18
Цитата Сообщение от volovzi Посмотреть сообщение
Evg, насколько я понимаю, эта утилита всё-таки предназначена для запуска тестов
А что мешает сделать вид, что ты запускаешь тест?

В качестве компилятора подсовываешь скрипт, который, грубо говоря, запускает gcc с перенаправлением его вывод в файл a.txt, и в конечном итоге скрипт создаёт файл a.out, в котором написано "cat a.txt". Далее dejagnu запускает файл a.out, думая, что он получен компилятором, фильтрует его выдачу, думая, что это выдача от теста

Добавлено через 56 секунд
Т.е. мы делаем вид, что используем dejagnu по прямому назначению, но используем его для других целей
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
10.08.2012, 15:11  [ТС]     Ошибка компиляции как положительный результат #19
Да, спасибо, подумаю.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2015, 17:22     Ошибка компиляции как положительный результат
Еще ссылки по теме:

Почему результат компиляции маленькой программы на с++ имеет довольно большой размер? C++
Каким будет результат компиляции и выполнения данного кода? C++
C++ Каким будет результат компиляции и выполнения данного кода?
С++ Ошибка компиляции C++
C++ Антивирус Касперского считает зараженным результат компиляции

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

Или воспользуйтесь поиском по форуму:
Виктор_Сен
33 / 26 / 1
Регистрация: 01.08.2011
Сообщений: 176
15.03.2015, 17:22     Ошибка компиляции как положительный результат #20
Если это во время компиляции, я представлял бы такое как условную компиляцию. Если один блок кода вызывает ошибку, то вместо него подставляется другой блок кода. Компиляция успешна, если хотя бы один из блоков не вызвал ошибку компиляции. Ну и во втором блоке можно сделать какую-то дополнительную работу, связанную с успешным выполнением негативного теста.
Yandex
Объявления
15.03.2015, 17:22     Ошибка компиляции как положительный результат
Ответ Создать тему
Опции темы

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