V675. Writing into the 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 *"?

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

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


Найденные ошибки

Проверено проектов
355
Собрано ошибок
13 303

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;