Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменение констант посредством указателей 
:(
    Опции темы
Compositum
  Дата 6.5.2011, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



   Изучаю C, экспериментирую. Написал такую функцию:
Код

#include <stdio.h>
extern int func2(int k);
void Func1(int *i);

main()
{
    const int i = 10;    
    printf("Начальное значение: %d\n", i);
    //Пытаюсь обмануть квалификатор "const"
    Func1(&i);
    printf("Текущее значение %d\n", i);        
    printf("Из функции func2 возвращено значение %d\n", func2(i));
    printf("Текущее значение %d\n", i);
}

//Изменение целого числа по указателю
void Func1(int *i){   
    printf("В Func1 изменяю значение const параметра посредством указателя. Получаю %d\n", ++*i);//увеличиваю константу на 1
}

   Ожидаю, что компилятор выдаст ошибку и не скомпилирует этот код. Однако, компилятор выдаёт предупреждающее сообщение и всё таки компилирует код. Сообщение такое:
Цитата

bush@mycomp:~/sources/c/lessons/HelloWorld$ gcc hello.c second.c
hello.c: In function ‘main’:
hello.c:10:2: warning: passing argument 1 of ‘Func1’ discards qualifiers from pointer target type
hello.c:4:6: note: expected ‘int *’ but argument is of type ‘const int *’

Т.е. компилятор меня предупреждает, что указатель позволяет работать с константой как с обычной переменной (действие const отменяется)...
Результат работы кода такой:
Цитата

Начальное значение: 10
В Func1 изменяю значение const параметра посредством указателя. Получаю 11
Текущее значение 11
В функции func2 значение параметра изменено на 12
Из функции func2 возвращено значение 24
Текущее значение 11

Видим, что после работы Func1, значение константы i увеличилось на единицу... Т.о. попытка переназначить значение для переменной, объявленной с модификатором const завершилась успешно. Но на самом деле это плохо, поскольку получается, что const не гарантирует, что переменная будет всё время иметь одно и то же значение (какой-нибудь злоумышленник может через указатели изменить это значение)...

Или я чего-то не понял?

Это сообщение отредактировал(а) Compositum - 6.5.2011, 22:37
PM   Вверх
bsa
Дата 6.5.2011, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Compositum, когда-то, давным-давно, не было модификатора const. И весь код был написан без него. Когда ввели этот модификатор, то чтобы не потерять совместимость со старым кодом, пришлось отказаться от строгой проверки, как это сделано было в С++. Думаю, у любого компилятора есть возможность сделать это предупреждение ошибкой.
PM   Вверх
Compositum
Дата 6.5.2011, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(bsa @ 6.5.2011,  22:50)
Compositum Думаю, у любого компилятора есть возможность сделать это предупреждение ошибкой.

Вы меня не верно поняли, поясняю на примере.
  Есть некая фирма ОАО Рога_и_Копыта, которая написала некоторую Программу, которая в свою очередь пользуется спросом в узких кругах. К этой программе можно подключать дополнительные модули, написанные сторонними разработчиками (задача модулей - расширять базовый функционал ПО). Пусть в программе имеется некоторое const поле (например хранящее значение НДС). Этой константой помимо программы пользуются и все модули. 
Существует вероятность того, что некоторый злой Ваня напишет модуль, в котором пропишет диверсию, с помощью которой изменит значение НДС (посредством указателя). Т.о. Программа работать не перестанет, но результаты у неё и у всех модулей будут некорректными. После такого события компания может потерять часть своих клиентов (либо вообще всех).

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

Вот о какой проблеме я говорю.
PM   Вверх
volatile
Дата 7.5.2011, 00:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Compositum, Си++шные модификаторы const (а также, например, private, protected ) не защищают код от злоумышленников. Это просто не их функция. Это скорей защита программера, от собственной невнимательности.

Как вариант, если нужно предоставлять НДС, можно объявить функцию
double get_NDS ();
ну и т.д.

хотя по большому счету, от хорошего злоумышленника и это не спасет.
PM MAIL   Вверх
kemiisto
  Дата 7.5.2011, 00:41 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 5
Всего: 160



Цитата(Compositum @  6.5.2011,  20:58 Найти цитируемый пост)
Изучаю C, экспериментирую.

user posted image 

Цитата(Compositum @  6.5.2011,  20:58 Найти цитируемый пост)
Или я чего-то не понял?

Цитата(Compositum @  6.5.2011,  22:31 Найти цитируемый пост)
Существует вероятность того, что некоторый злой Ваня напишет модуль, в котором пропишет диверсию, с помощью которой изменит значение НДС (посредством указателя).

Вы не поняли, что язык C (как, впрочем, и С++) годится разве что для таких вот, как Вы правильно выразились, диверсий. smile 

Одмины, молю, добавьте смайлик facepalm!


--------------------
PM MAIL WWW GTalk Jabber   Вверх
triclosan
Дата 7.5.2011, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



Цитата(kemiisto @  7.5.2011,  00:41 Найти цитируемый пост)
Вы не поняли, что язык C (как, впрочем, и С++) годится разве что для таких вот, как Вы правильно выразились, диверсий. smile 

_HOLY_WAR_REQUEST_DETECTED_
PM MAIL   Вверх
borisbn
Дата 7.5.2011, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Compositum @  6.5.2011,  21:58 Найти цитируемый пост)
Однако, компилятор выдаёт предупреждающее сообщение и всё таки компилирует код

интересно, что у тебя за компилятор. Вернее какой версии, т.к.
Цитата(Compositum @  6.5.2011,  21:58 Найти цитируемый пост)
bush@mycomp:~/sources/c/lessons/HelloWorld$ gcc hello.c second.c


вот твой код и он не компилируется (да и не должен)
http://liveworkspace.org/code/cf3c9171af71...f5d9a0295f70a2c


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Compositum
Дата 7.5.2011, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(borisbn @ 7.5.2011,  12:19)
Цитата(Compositum @  6.5.2011,  21:58 Найти цитируемый пост)
Однако, компилятор выдаёт предупреждающее сообщение и всё таки компилирует код

интересно, что у тебя за компилятор. Вернее какой версии, т.к.
Цитата(Compositum @  6.5.2011,  21:58 Найти цитируемый пост)
bush@mycomp:~/sources/c/lessons/HelloWorld$ gcc hello.c second.c


вот твой код и он не компилируется (да и не должен)
http://liveworkspace.org/code/cf3c9171af71...f5d9a0295f70a2c

Скриншот:

user posted image

PM   Вверх
borisbn
Дата 7.5.2011, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Compositum, ты привёл веские доказательства, но есть одно "но", я в твоих словах и не сомневался, меня итересовала лишь версия твоего компилятора


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Compositum
Дата 7.5.2011, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(borisbn @ 7.5.2011,  13:04)
Compositum, ты привёл веские доказательства, но есть одно "но", я в твоих словах и не сомневался, меня итересовала лишь версия твоего компилятора

Цитата

bush@mycomp:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.5.2-8ubuntu4' --with-bugurl=file:///usr/share/doc/gcc-4.5/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.5 --enable-shared --enable-multiarch --with-multiarch-defaults=x86_64-linux-gnu --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib/x86_64-linux-gnu --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.5 --libdir=/usr/lib/x86_64-linux-gnu --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-gold --enable-ld=default --with-plugin-ld=ld.gold --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4) 


Добавлено через 6 минут и 55 секунд
Цитата(borisbn @ 7.5.2011,  12:19)
Цитата(Compositum @  6.5.2011,  21:58 Найти цитируемый пост)
Однако, компилятор выдаёт предупреждающее сообщение и всё таки компилирует код

интересно, что у тебя за компилятор. Вернее какой версии, т.к.
Цитата(Compositum @  6.5.2011,  21:58 Найти цитируемый пост)
bush@mycomp:~/sources/c/lessons/HelloWorld$ gcc hello.c second.c


вот твой код и он не компилируется (да и не должен)
http://liveworkspace.org/code/cf3c9171af71...f5d9a0295f70a2c

Я внимательней посмотрел твою ссылку: твоя ошибка в том, что ты компилируешь как С++. А я пишу на С. Установи галочку для С, а не для С++ и всё заработает.
PM   Вверх
borisbn
Дата 7.5.2011, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Compositum @  7.5.2011,  13:08 Найти цитируемый пост)
Я внимательней посмотрел твою ссылку: твоя ошибка в том, что ты компилируешь как С++. А я пишу на С. Установи галочку для С, а не для С++ и всё заработает.

да, так и есть... странно, а в Си был const ??? или это какое-то расширение стандарта... 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Compositum
Дата 7.5.2011, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(borisbn @ 7.5.2011,  14:36)
да, так и есть... странно, а в Си был const ??? или это какое-то расширение стандарта...

Он есть и в C89 и в C99.
PM   Вверх
asmdzen
Дата 7.5.2011, 14:53 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



думаю если бы не передавался указатель на данную константу - она не превратилась бы в переменную:

Цитата(Compositum @  6.5.2011,  21:58 Найти цитируемый пост)
hello.c:10:2: warning: passing argument 1 of ‘Func1’ discards qualifiers from pointer target type

это и означает что компилятор просто убрал "const" - осталась обычная переменная.
если такого не делать - никакой злоумышленник ничего не сможет с этой консантой сделать, она просто скомпилится как значение.
чтоб избежать такой путаницы можно просто воспользоватся "#define" )

PM MAIL   Вверх
borisbn
Дата 7.5.2011, 14:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(Compositum @  6.5.2011,  23:31 Найти цитируемый пост)
Пусть в программе имеется некоторое const поле (например хранящее значение НДС). Этой константой помимо программы пользуются и все модули. 

...
Цитата(Compositum @  6.5.2011,  23:31 Найти цитируемый пост)
Т.о. Программа работать не перестанет, но результаты у неё и у всех модулей будут некорректными. После такого события компания может потерять часть своих клиентов (либо вообще всех).


Если в ОАО Рога_и_Копыта сделали такую систему плагинов, в которой передают плагинам неконстантный указатель на свою, да ещё и важную, константу, то мне их нисколько не жаль.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Compositum
Дата 7.5.2011, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(borisbn @ 7.5.2011,  14:59)
Если в ОАО Рога_и_Копыта сделали такую систему плагинов, в которой передают плагинам неконстантный указатель на свою, да ещё и важную, константу, то мне их нисколько не жаль.

Не важно есть или нет. Я пример привёл, когда этой "фичей" могут воспользоваться во зло.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1283 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.