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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
29.12.2012, 14:56     Как заставить компилятор не компилить неправильную программу? #1
Мне не даёт покоя разговор с одним программистом, имевший место быть несколько лет назад. Тот сказал, что он так кодит, что у него неправильный код просто-напросто не компилится, а я не стал уточнять. Многое я бы отдал, чтобы вернуться к тому разговору!

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

C++
1
2
3
4
5
6
7
8
9
10
int main () {
 int p;
 
 //есть ли способ сделать так, чтобы 
 //компилятор  ругался на присвоение
 //(ЛЮБЫМ способом) переменной p
 //определённого значения, например, 7?
 returtn 0;
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2012, 14:56     Как заставить компилятор не компилить неправильную программу?
Посмотрите здесь:

как компилить программу с libjpeg C++
C++ Как заставить программу управлять программами?
C++ Как заставить компилятор выводить имя файла?
C++ Как компилить x64?
Как заставить программу запустить другую программу C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CableGuy
 Аватар для CableGuy
14 / 14 / 1
Регистрация: 29.03.2012
Сообщений: 41
29.12.2012, 15:22     Как заставить компилятор не компилить неправильную программу? #2
C++
1
const int p;
Байт
 Аватар для Байт
13940 / 8771 / 1219
Регистрация: 24.12.2010
Сообщений: 15,872
29.12.2012, 15:32     Как заставить компилятор не компилить неправильную программу? #3
Цитата Сообщение от CableGuy Посмотреть сообщение
C++
1
const int p;
А вот так
C
1
 BabFunc((int *)(&p));
не удастся ли обмануть? Или даже
C
1
 (int) p = 8;
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.12.2012, 15:43     Как заставить компилятор не компилить неправильную программу? #4
kravam, Средствами языка все же никак. Присвоение ведь идет не на этапе компиляция
Vladimir616
110 / 110 / 3
Регистрация: 05.07.2009
Сообщений: 224
29.12.2012, 15:49     Как заставить компилятор не компилить неправильную программу? #5
kravam, заблокировать присвоение переменной определённого значения до этапа компиляции конечно возможно (теоретически, с использованием интерпретатора), однако бессмысленно, т.к большинство программ получает данные извне, что невозможно контролировать на этапе компиляции. Если же ваша переменная не зависит от внешней среды и входных данных, то лучше, наверное, написать для неё специальный класс и перегрузить оператор присваивания, так будет гораздо проще
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.12.2012, 15:54     Как заставить компилятор не компилить неправильную программу? #6
Если переменной присваивается значение на стадии компиляции, то static_assert. Если в рантайме - assert.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.12.2012, 16:00     Как заставить компилятор не компилить неправильную программу? #7
diagon, static_assert соглашусь. assert - нет. первое - не этап компиляции, второе - только отладочный режим.
OhMyGodSoLong
29.12.2012, 16:00
  #8

Не по теме:

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

Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
29.12.2012, 17:19     Как заставить компилятор не компилить неправильную программу? #9
не по теме, но как-то на защиту к нам зашел другой преподаватель, и когда я заговорил о константах, он сказал "а хочешь я докажу, что констант не существует?", правда я ответил "нет спасибо" и он не стал говорить, но, всё же, что он имел ввиду?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
29.12.2012, 17:33     Как заставить компилятор не компилить неправильную программу? #10
Например, это.
Или это.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.12.2012, 17:35     Как заставить компилятор не компилить неправильную программу? #11
diagon, а как же constexpr?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.12.2012, 12:23     Как заставить компилятор не компилить неправильную программу? #12
Цитата Сообщение от kravam Посмотреть сообщение
он так кодит, что у него неправильный код просто-напросто не компилится, а я не стал уточнять.
А как он может скомпилиться?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 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;
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.12.2012, 12:46     Как заставить компилятор не компилить неправильную программу? #14
По языку здесь всё правильно, синтаксическую проверку прога пройдёт.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.12.2012, 12:47     Как заставить компилятор не компилить неправильную программу? #15
Вот только функция не делает то, что должна делать.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
30.12.2012, 12:47     Как заставить компилятор не компилить неправильную программу? #16
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Вот это неправильный код, реализующий умножение двух чисел:
Код правильный, точнее валидный но компилятор же не знает что нужно программисту. Тут логика не та и это уже не заботы компилятора. В конце концов, если клавиатура сломана, он еще и печатать должен за программиста?

Компьютер невероятно быстрая и в тоже время необычайно тупая машина. Не помню в какой книге вычитал(точно учебник Си++).
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.12.2012, 13:13     Как заставить компилятор не компилить неправильную программу? #17
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Вот только функция не делает то, что должна делать.
С чьей точки зрения должна? Она делает то, как написана, то есть то, что должна делать с точки зрения компилятора. А то, что "программист" не понимает смысла собственных действий, к делу не относится. Чтоб не допускать семантических ошибок, надо думать, что пишешь, и знать язык, а синтаксически функция правильна.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
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) Вот и ошибка компиляции. Как-то так.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.12.2012, 15:08     Как заставить компилятор не компилить неправильную программу? #19
Цитата Сообщение от kravam Посмотреть сообщение
Смотрим перегруженный оператор = класса T
2) Определяем, что параметром к этому оператору может идти какой-нибудь класс T1
3) Пытаемся перетипизировать (T1)8, а не получается
4) Вот и ошибка компиляции. Как-то так.
Конструктор не работает на этапе компиляции и как ты не проверяй параметр в конструкторе, компилятор не сможет понять, чего ты хотел. Он может только формально перевести текст в код, но не проанализировать логику на предмет того, какую сгенерить "пользовательскую" гугломессагу. Он понимает лишь алгоритмы, но не их назначение. Единственное, как можно конкретное значение запретить при компиляции, это сделать его не представимым, например, сократить разрядность до 3-х бит, тогда диапазон представимых чисел от ноля до семи, восемь в него не входит.

Добавлено через 1 минуту
Можно, конечно, каждое разрешённое значение закейсовать, но это перенос проблемы и её усугубление, а не решение: можно ошибиться при написании миллиардов кейсов и компилятор это проглотит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2012, 15:50     Как заставить компилятор не компилить неправильную программу?
Еще ссылки по теме:

C++ есть ли компилятор для андроида? на планшете хочу компилить
C++ Как заставить программу выбирать наибольшие число?
C++ Как заставить компилятор давать имена символам, соответствующие названиям функций?

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.12.2012, 15:50     Как заставить компилятор не компилить неправильную программу? #20
taras atavin, Это знаете-ли неправда. constexpr конструкторы никто не отменял.
Yandex
Объявления
30.12.2012, 15:50     Как заставить компилятор не компилить неправильную программу?
Ответ Создать тему
Опции темы

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