274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
1 | |
Ошибка компиляции как положительный результат09.08.2012, 19:45. Показов 3167. Ответов 20
Товарищи, подскажите, пожалуйста, есть ли возможность средствами плюсов следить за ошибками компиляции?
Необходимо в процессе компиляции встретить некоторое выражение, удостовериться, что на нём произошла ошибка компиляции, и продолжить компиляцию дальше. При этом в итоге компиляция должна пройти успешно, то есть эта ожидаемая ошибка должна быть подавлена. Получается нечто вроде исключений, но для компиляции. Если средствами плюсов такое сделать не получится (что вероятнее всего), то как можно попроще это реализовать внешними инструментами?
0
|
09.08.2012, 19:45 | |
Ответы с готовыми решениями:
20
Результат компиляции Ошибка при компиляции, как перевести? Intellij IDEA не отображает результат компиляции Вывести результат компиляции в *.txt файл |
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
||||||
09.08.2012, 23:06 [ТС] | 3 | |||||
Например, я в какой-нибудь функции пишу:
0
|
09.08.2012, 23:09 | 4 |
Вот здесь хоть как-нибудь внятно поясни, что ты подразумеваешь и на кой хер оно вообще надо. И поставь задачу целиком, потому что по твоей постановке вопроса проще всего ответить "никак", но есть подозрение, что ты просто неправильно к проектированию программы подходишь
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 Теперь я пишу тест для этой метафункции:
Я жду этих ошибок, то есть я хочу, чтобы они произошли. Если они не произошли, то это значит, что тест не пройден. И наоборот, если они произошли, то всё в порядке. И в итоге я хочу, чтобы если тест пройден успешно, компиляция завершалась успешно, а если тест не пройден, выдавалось бы соответствующее сообщение.
0
|
10.08.2012, 00:05 | 6 |
Постановка задачи примерно понятна. А с какой целью у тебя написаны строки 11 и 12? С целью тестирования твоей реализации (т.е. весь пример - это не боевая программа, а тестовый пример)?
Добавлено через 55 секунд Другими словами, то, что называют "негативный тест"?
0
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
10.08.2012, 00:11 [ТС] | 7 |
Да, получается так. Негативный тест.
0
|
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
|
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 | |||||
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
|
10.08.2012, 08:31 | 16 |
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++; } }
1
|
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
|
|
10.08.2012, 14:03 [ТС] | 17 |
Evg, насколько я понимаю, эта утилита всё-таки предназначена для запуска тестов. А мне запуск вообще не требуется, меня интересует только компиляция, и то в половине случаев меня интересует падение при компиляции .
Но спасибо за информацию.
0
|
10.08.2012, 14:57 | 18 |
А что мешает сделать вид, что ты запускаешь тест?
В качестве компилятора подсовываешь скрипт, который, грубо говоря, запускает 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 | |
15.03.2015, 17:22 | |
Помогаю со студенческими работами здесь
20
Результат компиляции промежуточного значения строки Как включить поддержку C++11 в g++? Ошибка при компиляции Антивирус Касперского считает зараженным результат компиляции Каким будет результат компиляции и выполнения данного кода? ОшибкаЛНК1168 - не удается открыть результат компиляции для записи Каким будет результат компиляции и выполнения данного кода? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |