Проблема
Запись в const квалифицированный объект происходит, когда вы выполняете одно из следующих действий:
Используйте const- квалифицированный объект как место назначения присвоения.
Передайте const- квалифицированный объект к функции, которая изменяет аргумент.
Например, дефект может произойти в следующих ситуациях:
Вы передаете const- квалифицированный объект в качестве первого аргумента одной из следующих функций:
mkstemp
mkostemp
mkostemps
mkdtemp
Вы передаете const- квалифицированный объект в качестве целевого аргумента одной из следующих функций:
strcpy
strncpy
strcat
memset
Вы выполняете операцию записи на const- квалифицированный объект.
Риск
Риск зависит от модификаций, сделанных к const- квалифицированный объект.
| Ситуация | Риск |
|---|
Передача mkstemp, mkostemp, mkostemps, mkdtemp, и так далее. | Эти функции заменяют последние шесть символов своего первого аргумента со строкой. Поэтому они ожидают модифицируемый char массив в качестве их первого аргумента. |
Передача strcpy, strncpystrcat, memset и так далее. | Эти функции изменяют свой целевой аргумент. Поэтому они ожидают модифицируемый char массив в качестве их целевого аргумента. |
| Запись в объект | const спецификатор подразумевает соглашение, что значение объекта не будет изменено. Путем записи в const- квалифицированный объект, вы расторгаете соглашение. Результат операции не определен. |
Фиксация
Фиксация зависит от модификации, сделанной к const- квалифицированный объект.
| Ситуация | Фиксация |
|---|
Передача mkstemp, mkostemp, mkostemps, mkdtemp, и так далее. | Передайте non-const возразите в качестве первого аргумента функции. |
Передача strcpy, strncpystrcat, memset и так далее. | Передайте non-const возразите в качестве целевого аргумента функции. |
| Запись в объект | Выполните операцию записи на non-const объект. |
Смотрите примеры мер ниже.
Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.
Пример - пишущий в const- Квалифицированный Объект
#include <string.h>
const char* buffer = "abcdeXXXXXXX";
void func(char* string) {
char *ptr = (char*)strchr(buffer,'X');
if(ptr)
strcpy(ptr,string);
}
В этом примере, потому что buffer const- квалифицированный, strchr(buffer,'X') возвращает const- квалифицированный char* указатель. Когда этот char* указатель используется в качестве целевого аргумента strcpy, ошибка Writing to const qualified object появляется.
Коррекция — копирует const- Квалифицированный объект к Non-const Объект
Одна возможная коррекция должна присвоить постоянную строку non-const возразите и используйте non-const возразите в качестве целевого аргумента strchr.
#include <string.h>
char buffer[] = "abcdeXXXXXXX";
void func(char* string) {
char *ptr = (char*)strchr(buffer,'X');
if(ptr)
strcpy(ptr,string);
}