Writing to const qualified object

Объект объявляется с 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 Адреса Через Исправления ошибок или Выравнивания.

Примеры

развернуть все

#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);
}

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: CONSTANT_OBJECT_WRITE
Удар: высоко
ID CWE: 227, 471, 686
Введенный в R2015b