![]() |
|
Модераторы: bsa |
![]()
|
|
| Compositum |
|
||||||
|
Senior developer ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 430 Регистрация: 6.1.2008 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Изучаю C, экспериментирую. Написал такую функцию:
Ожидаю, что компилятор выдаст ошибку и не скомпилирует этот код. Однако, компилятор выдаёт предупреждающее сообщение и всё таки компилирует код. Сообщение такое:
Т.е. компилятор меня предупреждает, что указатель позволяет работать с константой как с обычной переменной (действие const отменяется)... Результат работы кода такой:
Видим, что после работы Func1, значение константы i увеличилось на единицу... Т.о. попытка переназначить значение для переменной, объявленной с модификатором const завершилась успешно. Но на самом деле это плохо, поскольку получается, что const не гарантирует, что переменная будет всё время иметь одно и то же значение (какой-нибудь злоумышленник может через указатели изменить это значение)... Или я чего-то не понял? Это сообщение отредактировал(а) Compositum - 6.5.2011, 22:37 |
||||||
|
|||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Compositum, когда-то, давным-давно, не было модификатора const. И весь код был написан без него. Когда ввели этот модификатор, то чтобы не потерять совместимость со старым кодом, пришлось отказаться от строгой проверки, как это сделано было в С++. Думаю, у любого компилятора есть возможность сделать это предупреждение ошибкой.
|
|||
|
||||
| Compositum |
|
|||
|
Senior developer ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 430 Регистрация: 6.1.2008 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Вы меня не верно поняли, поясняю на примере. Есть некая фирма ОАО Рога_и_Копыта, которая написала некоторую Программу, которая в свою очередь пользуется спросом в узких кругах. К этой программе можно подключать дополнительные модули, написанные сторонними разработчиками (задача модулей - расширять базовый функционал ПО). Пусть в программе имеется некоторое const поле (например хранящее значение НДС). Этой константой помимо программы пользуются и все модули. Существует вероятность того, что некоторый злой Ваня напишет модуль, в котором пропишет диверсию, с помощью которой изменит значение НДС (посредством указателя). Т.о. Программа работать не перестанет, но результаты у неё и у всех модулей будут некорректными. После такого события компания может потерять часть своих клиентов (либо вообще всех). Ваня ведь не станет в своём компиляторе настраивать, чтобы предупреждение расценивалось как ошибка, ибо наличие этой ошибки - его основная задумка... Вот о какой проблеме я говорю. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Compositum, Си++шные модификаторы const (а также, например, private, protected ) не защищают код от злоумышленников. Это просто не их функция. Это скорей защита программера, от собственной невнимательности.
Как вариант, если нужно предоставлять НДС, можно объявить функцию double get_NDS (); ну и т.д. хотя по большому счету, от хорошего злоумышленника и это не спасет. |
|||
|
||||
| kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
Вы не поняли, что язык C (как, впрочем, и С++) годится разве что для таких вот, как Вы правильно выразились, диверсий. Одмины, молю, добавьте смайлик facepalm! -------------------- |
|||
|
||||
| triclosan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 515 Регистрация: 18.8.2006 Репутация: 2 Всего: 12 |
||||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
интересно, что у тебя за компилятор. Вернее какой версии, т.к.
вот твой код и он не компилируется (да и не должен) http://liveworkspace.org/code/cf3c9171af71...f5d9a0295f70a2c -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| Compositum |
|
||||||
|
Senior developer ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 430 Регистрация: 6.1.2008 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Скриншот: ![]() |
||||||
|
|||||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Compositum, ты привёл веские доказательства, но есть одно "но", я в твоих словах и не сомневался, меня итересовала лишь версия твоего компилятора
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Compositum |
|
||||||||||
|
Senior developer ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 430 Регистрация: 6.1.2008 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Добавлено через 6 минут и 55 секунд
Я внимательней посмотрел твою ссылку: твоя ошибка в том, что ты компилируешь как С++. А я пишу на С. Установи галочку для С, а не для С++ и всё заработает. |
||||||||||
|
|||||||||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
да, так и есть... странно, а в Си был const ??? или это какое-то расширение стандарта... -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Compositum |
|
|||
|
Senior developer ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 430 Регистрация: 6.1.2008 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Он есть и в C89 и в C99. |
|||
|
||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
думаю если бы не передавался указатель на данную константу - она не превратилась бы в переменную:
это и означает что компилятор просто убрал "const" - осталась обычная переменная. если такого не делать - никакой злоумышленник ничего не сможет с этой консантой сделать, она просто скомпилится как значение. чтоб избежать такой путаницы можно просто воспользоватся "#define" ) |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
... Если в ОАО Рога_и_Копыта сделали такую систему плагинов, в которой передают плагинам неконстантный указатель на свою, да ещё и важную, константу, то мне их нисколько не жаль. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Compositum |
|
|||
|
Senior developer ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 430 Регистрация: 6.1.2008 Где: Санкт-Петербург Репутация: нет Всего: 1 |
Не важно есть или нет. Я пример привёл, когда этой "фичей" могут воспользоваться во зло. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |