Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
1

Как заставить компилятор не компилить неправильную программу?

29.12.2012, 14:56. Показов 2723. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Мне не даёт покоя разговор с одним программистом, имевший место быть несколько лет назад. Тот сказал, что он так кодит, что у него неправильный код просто-напросто не компилится, а я не стал уточнять. Многое я бы отдал, чтобы вернуться к тому разговору!

Ясно дело, что даже если это и правда, то правда условная. Компилятор же не знает, что нужно человеку. Тем не мене, может есть какие-то способы ограничить поведение (предотвратить его) программы на стадии компиляции при синтаксически правильном коде? Будем здесь их обсуждать. Начнём с простого.

C++
1
2
3
4
5
6
7
8
9
10
int main () {
 int p;
 
 //есть ли способ сделать так, чтобы 
 //компилятор  ругался на присвоение
 //(ЛЮБЫМ способом) переменной p
 //определённого значения, например, 7?
 returtn 0;
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.12.2012, 14:56
Ответы с готовыми решениями:

Компилятор в Qt Creator: как заставить скомпилироваться и запуститься программу?
Добрый день. Я сегодня изучал С++ по Лафоре (книга) и вообщем там было задание в одном из разделов,...

есть ли компилятор для андроида? на планшете хочу компилить
или процессор в планшете не поддержит мою идею?

Как компилить программу с libjpeg?
Я не понимаю, как компилить программу с libjpeg, если я использую Visual Studio. Г* командная...

Как компилить программу .exe в другое разрешение?
Компилятор для C++ или C#, для перевода .exe в .vut с работоспособностью кода при обратном...

26
15 / 15 / 2
Регистрация: 29.03.2012
Сообщений: 41
29.12.2012, 15:22 2
C++
1
const int p;
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
29.12.2012, 15:32 3
Цитата Сообщение от CableGuy Посмотреть сообщение
C++
1
const int p;
А вот так
C
1
 BabFunc((int *)(&p));
не удастся ли обмануть? Или даже
C
1
 (int) p = 8;
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.12.2012, 15:43 4
kravam, Средствами языка все же никак. Присвоение ведь идет не на этапе компиляция
0
113 / 113 / 28
Регистрация: 05.07.2009
Сообщений: 225
29.12.2012, 15:49 5
kravam, заблокировать присвоение переменной определённого значения до этапа компиляции конечно возможно (теоретически, с использованием интерпретатора), однако бессмысленно, т.к большинство программ получает данные извне, что невозможно контролировать на этапе компиляции. Если же ваша переменная не зависит от внешней среды и входных данных, то лучше, наверное, написать для неё специальный класс и перегрузить оператор присваивания, так будет гораздо проще
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.12.2012, 15:54 6
Если переменной присваивается значение на стадии компиляции, то static_assert. Если в рантайме - assert.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.12.2012, 16:00 7
diagon, static_assert соглашусь. assert - нет. первое - не этап компиляции, второе - только отладочный режим.
0
OhMyGodSoLong
29.12.2012, 16:00
  #8

Не по теме:

Использовать Haskell.

1
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
29.12.2012, 17:19 9
не по теме, но как-то на защиту к нам зашел другой преподаватель, и когда я заговорил о константах, он сказал "а хочешь я докажу, что констант не существует?", правда я ответил "нет спасибо" и он не стал говорить, но, всё же, что он имел ввиду?
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.12.2012, 17:33 10
Например, это.
Или это.
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
29.12.2012, 17:35 11
diagon, а как же constexpr?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2012, 12:23 12
Цитата Сообщение от kravam Посмотреть сообщение
он так кодит, что у него неправильный код просто-напросто не компилится, а я не стал уточнять.
А как он может скомпилиться?
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
30.12.2012, 12:44 13
Цитата Сообщение от taras atavin Посмотреть сообщение
А как он может скомпилиться?
Легко. Вот это неправильный код, реализующий умножение двух чисел:
C++
1
2
3
4
int mul(int a, int b)
{
    return a + b;
}
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2012, 12:46 14
По языку здесь всё правильно, синтаксическую проверку прога пройдёт.
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
30.12.2012, 12:47 15
Вот только функция не делает то, что должна делать.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
30.12.2012, 12:47 16
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Вот это неправильный код, реализующий умножение двух чисел:
Код правильный, точнее валидный но компилятор же не знает что нужно программисту. Тут логика не та и это уже не заботы компилятора. В конце концов, если клавиатура сломана, он еще и печатать должен за программиста?

Компьютер невероятно быстрая и в тоже время необычайно тупая машина. Не помню в какой книге вычитал(точно учебник Си++).
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2012, 13:13 17
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Вот только функция не делает то, что должна делать.
С чьей точки зрения должна? Она делает то, как написана, то есть то, что должна делать с точки зрения компилятора. А то, что "программист" не понимает смысла собственных действий, к делу не относится. Чтоб не допускать семантических ошибок, надо думать, что пишешь, и знать язык, а синтаксически функция правильна.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
30.12.2012, 14:33  [ТС] 18
Так-то из области фантастики задача, но хоть ЧТО-ТО мы ведь можем проконтролировать? Щас вот изучаю C# так там прямо сказано- они частично ошибки времени выполнения делаю ошибками компиляции с помощью хитрой какой-то перетипизации

+++++++++++++++++++++++++++++++++++++++++++

Ну вот допустим я пишу так (ошибочно!)
C++
1
int p= 8;
То есть я не должен присваивать переменной p значение 8, а я присвоил. Это же можно как-то проконтролировать? Например использовать не переменнную типа int, а создать класс, в котором инкапсулировать переменную int; и сделать так чтобы в правой части была тоже не переменная int, а переменная какого-нибудь хитрого класса. И чтобы объекты этого класса не могли принимать значение 8

Ну то есть чтобы был контроль типов. Чтобы логика компилятора была примерно такая:
C++
1
T p= 8;
1) Смотрим перегруженный оператор = класса T
2) Определяем, что параметром к этому оператору может идти какой-нибудь класс T1
3) Пытаемся перетипизировать (T1)8, а не получается
4) Вот и ошибка компиляции. Как-то так.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.12.2012, 15:08 19
Цитата Сообщение от kravam Посмотреть сообщение
Смотрим перегруженный оператор = класса T
2) Определяем, что параметром к этому оператору может идти какой-нибудь класс T1
3) Пытаемся перетипизировать (T1)8, а не получается
4) Вот и ошибка компиляции. Как-то так.
Конструктор не работает на этапе компиляции и как ты не проверяй параметр в конструкторе, компилятор не сможет понять, чего ты хотел. Он может только формально перевести текст в код, но не проанализировать логику на предмет того, какую сгенерить "пользовательскую" гугломессагу. Он понимает лишь алгоритмы, но не их назначение. Единственное, как можно конкретное значение запретить при компиляции, это сделать его не представимым, например, сократить разрядность до 3-х бит, тогда диапазон представимых чисел от ноля до семи, восемь в него не входит.

Добавлено через 1 минуту
Можно, конечно, каждое разрешённое значение закейсовать, но это перенос проблемы и её усугубление, а не решение: можно ошибиться при написании миллиардов кейсов и компилятор это проглотит.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
30.12.2012, 15:50 20
taras atavin, Это знаете-ли неправда. constexpr конструкторы никто не отменял.
0
30.12.2012, 15:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.12.2012, 15:50
Помогаю со студенческими работами здесь

Как заставить компилятор применить нужную команду
Всем , здравствуйте! Простой такой кодик , но не работает. Т.к компилятор вместо команды SUBI -...

Как заставить компилятор выводить имя файла?
Всем привет! Компилятор GCC. Из Readme: Проблема вот в чем. Создал батник, для экономии...

Как заставить компилятор делать определенный отступ между методами
Сабж. Отступ в 1 строчку меня не устраивает. Хотя бы 2-3. Вручную лень, хочу автоматизировать. То...

Как заставить компилятор давать имена символам, соответствующие названиям функций?
Здравствуйте! Пишу динамическую библиотеку, в которой имплементирую функцию run() - эта функция...


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

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