Защита данных переменной с помощью константного квалификатора бесполезна !!!? - PullRequest
2 голосов
/ 26 мая 2011
#include<stdio.h>

int main()
{
    const char const_cvar1 = 'X';

    const char* ptr_to_const_char = &const_cvar1;

   // Simply a typecast of "ptr to a const char" to a "ptr to char" disables security !!!
    *(char *)ptr_to_const_char = 'S';
    printf("\n  Value of const char changed from X to : %c \n", const_cvar1);

    return 0;
}

Выходы: -

Значение константного символа изменено с X на: S

Интересно, можем ли мы никогда не полагаться на квалификатор const в C? это факт?

Ответы [ 6 ]

13 голосов
/ 26 мая 2011

Это C. Вы можете делать много глупостей, вызывающих неопределенное поведение, зависящих от компилятора / платформы и т. Д.

Отбрасывание модификатора const - одна из них.Вы можете сделать это, но у вас мало гарантий относительно того, каким будет результат.

Вы можете даже привести его к чему угодно, на свой страх и риск.

 *(float *)ptr_to_const_char = 2.18;

Тем не менее, const не бесполезен.

  • Он предоставляет документацию, программист, читающий код, где указатель объявлен, const может предположить, что он может / не должен изменять то, на что указывает указатель
  • Itможет позволить компилятору выполнять дальнейшую оптимизацию

Просто имейте в виду, что C не защищает вас от вас самих или других, а также дает вам возможность не соблюдать систему типов.

2 голосов
/ 26 мая 2011

const не защищает переменную. На самом деле, const даже не означает, что переменная никогда не изменится.

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

Так что, если вы нарушите это обещание - что вы не собираетесь писать ему - ну, тогда да, конечно, это все испортит.

2 голосов
/ 26 мая 2011

Это действительно факт.Фактически, компилятор отключает const-оптимизацию (их мало) в тот момент, когда он видит, что вы отбрасываете const, обрабатывая его как любую другую переменную.

0 голосов
/ 26 мая 2011

Изменение содержимого переменной, определенной как const, с использованием таких средств, очевидно, UB. Избегайте этого.

0 голосов
/ 26 мая 2011

Я верю, что вы хотите

 char * const ptr_to_const_char

это указатель на константу, а не указатель на константу.

Но это может работать только в C ++.

0 голосов
/ 26 мая 2011

Вы программируете на C, и это всегда так.Во время игры с указателями вы всегда должны быть осторожны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...