# V675. Writing into read-only memory.

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

Рассмотрим пример.

    char *s = "A_string";
    if (x)
      s[0] = 'B';

Здесь указатель 's' ссылается на область памяти, предназначенной только для чтения. Изменение этой памяти приведёт к неопределённому поведению программы. Скорее всего, это неопределенное поведение программы будет представлять собой access violation.

Исправленный вариант программы:

    char s[] = "A_string";
    if (x)
      s[0] = 'B';

На стеке создастся массив 's' и в него будет скопирована строка из read-only памяти. Теперь строку 's' можно изменять.

P.S.

Если "A_string" представляет собой "const char *", то почему этот тип неявно приводится к "char *"?

Такое поведение существует из-за соображений совместимости. Было написано ОЧЕНЬ много кода на Си, где используются не константные указатели. Разработчики стандарта/компиляторов не нашли в себе силы в этом месте сломать обратную совместимость с имеющимся кодом.

Данная диагностика классифицируется как:

CERT-ENV30-C CERT-STR30-C

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V675.