Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
1

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

09.08.2012, 19:45. Показов 3167. Ответов 20

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

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

Если средствами плюсов такое сделать не получится (что вероятнее всего), то как можно попроще это реализовать внешними инструментами?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2012, 19:45
Ответы с готовыми решениями:

Результат компиляции
Скажите, в какой язык компилируются современные программы написанные на с/с++? И какие языки...

Ошибка при компиляции, как перевести?
В спойлере скрин - как перевести эту ошибку? Компилил с IDE CppDroid, она пропускалась, Dev-CPP в...

Intellij IDEA не отображает результат компиляции
Добрый вечер. Установил Intellij IDEA последней версии. Пишу свой первый код, Hello World...

Вывести результат компиляции в *.txt файл
у меня есть така матрица, надо вывести результат компиляции в *.txt файл #include <stdio.h>...

20
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.08.2012, 22:59 2
А можешь более конкретный и живой пример привести? Просто для наглядного понимания того, что же ты хочешь
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
09.08.2012, 23:06  [ТС] 3
Например, я в какой-нибудь функции пишу:
C++
1
    static_assert(false, "Ура, произошла ошибка.");
Вот на этой строке я хочу эту ошибку поймать, удостовериться, что она есть, подавить её, пойти компилировать дальше и достигнуть успешной компиляции.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
09.08.2012, 23:09 4
Цитата Сообщение от volovzi Посмотреть сообщение
Вот на этой строке я хочу эту ошибку поймать, удостовериться, что она есть, подавить её
Вот здесь хоть как-нибудь внятно поясни, что ты подразумеваешь и на кой хер оно вообще надо. И поставь задачу целиком, потому что по твоей постановке вопроса проще всего ответить "никак", но есть подозрение, что ты просто неправильно к проектированию программы подходишь
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
09.08.2012, 23:49  [ТС] 5
Я правильно подхожу .
Объясню подробнее. Я пишу библиотеку метафункций https://github.com/izvolov/Meta.
В ней есть метафункция, которая извлекает из шаблонного типа нужный тип по индексу: https://github.com/izvolov/Met... ess/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 произойдут ошибки компиляции, поскольку в первом случае происходит попытка доступа по отрицательному индексу, а во втором — выход за рамки возможных индексов.
Я жду этих ошибок, то есть я хочу, чтобы они произошли. Если они не произошли, то это значит, что тест не пройден. И наоборот, если они произошли, то всё в порядке.

И в итоге я хочу, чтобы если тест пройден успешно, компиляция завершалась успешно, а если тест не пройден, выдавалось бы соответствующее сообщение.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
10.08.2012, 00:05 6
Постановка задачи примерно понятна. А с какой целью у тебя написаны строки 11 и 12? С целью тестирования твоей реализации (т.е. весь пример - это не боевая программа, а тестовый пример)?

Добавлено через 55 секунд
Другими словами, то, что называют "негативный тест"?
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
10.08.2012, 00:11  [ТС] 7
Да, получается так. Негативный тест.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
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
Первый запуск должен отработать успешно, все остальные - упасть при компиляции
2
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
10.08.2012, 00:20 9
volovzi, в boost::mpl есть похожие на это проверки типов
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
10.08.2012, 00:20 10
Более сложный (но более качественный) запуск ещё бы и анализировал выдачу компилятора (что диагностика именно та, которая ожидалась)
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
10.08.2012, 00:28  [ТС] 11
Evg, спасибо, буду думать.


alex_x_x, ссылочку, пожалуйста.
0
бжни
2473 / 1684 / 135
Регистрация: 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/... ssert.html
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
10.08.2012, 00:38  [ТС] 13
alex_x_x, отлично. А как это относится к теме?
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
10.08.2012, 00:41 14
ну ок, не вчитывался
0
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
10.08.2012, 01:14  [ТС] 15
Ну да, видимо, придётся писать скрипты на баше, которые будут сначала генерировать плюсовый код, а потом несколько раз компилировать его с разными значениями макроса.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
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".
1
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
10.08.2012, 14:03  [ТС] 17
Evg, насколько я понимаю, эта утилита всё-таки предназначена для запуска тестов. А мне запуск вообще не требуется, меня интересует только компиляция, и то в половине случаев меня интересует падение при компиляции .
Но спасибо за информацию.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
10.08.2012, 14:57 18
Цитата Сообщение от volovzi Посмотреть сообщение
Evg, насколько я понимаю, эта утилита всё-таки предназначена для запуска тестов
А что мешает сделать вид, что ты запускаешь тест?

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

Добавлено через 56 секунд
Т.е. мы делаем вид, что используем dejagnu по прямому назначению, но используем его для других целей
1
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
10.08.2012, 15:11  [ТС] 19
Да, спасибо, подумаю.
0
36 / 29 / 2
Регистрация: 01.08.2011
Сообщений: 176
15.03.2015, 17:22 20
Если это во время компиляции, я представлял бы такое как условную компиляцию. Если один блок кода вызывает ошибку, то вместо него подставляется другой блок кода. Компиляция успешна, если хотя бы один из блоков не вызвал ошибку компиляции. Ну и во втором блоке можно сделать какую-то дополнительную работу, связанную с успешным выполнением негативного теста.
0
15.03.2015, 17:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2015, 17:22
Помогаю со студенческими работами здесь

Результат компиляции промежуточного значения строки
Доброго дня форумчанам. Уж не знаю, как точнее назвать тему, потому, если кому-то не нравится -...

Как включить поддержку C++11 в g++? Ошибка при компиляции
Добрый день, нужна помощь не пойму! При компиляции выдаёт note: C++11 ‘constexpr’ only available...

Антивирус Касперского считает зараженным результат компиляции
Здравствуйте. Второй раз уже сталкиваюсь с .. трояном? Скрин прилагается. &quot;Сейчас я Вам все там...

Каким будет результат компиляции и выполнения данного кода?
void main(void) { char alphabet ; int index; for (letter = &quot;A&quot;, index = 0; letter &lt;= &quot;Я&quot;;...

ОшибкаЛНК1168 - не удается открыть результат компиляции для записи
Ошибка LNK1168 не удается открыть C:\Users\Lenovo\source\repos\Project1\Debug\Project1.exe для...

Каким будет результат компиляции и выполнения данного кода?
struct employee { char name ; int office_number; }; using namespace std; void main(void) {...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru