Запись в const квалифицировала объект

Объект, объявленный со спецификатором const, изменяется

Описание

Запись в const, квалифицированный объект происходит, когда вы выполняете одно из следующих действий:

  • Используйте const - квалифицированный объект как место назначения присвоения.

  • Передайте const - квалифицированный объект к функции, которая изменяет аргумент.

Например, дефект может произойти в следующих ситуациях:

  • Вы передаете const - квалифицированный объект в качестве первого аргумента одной из следующих функций:

    • mkstemp

    • mkostemp

    • mkostemps

    • mkdtemp

  • Вы передаете const - квалифицированный объект в качестве целевого аргумента одной из следующих функций:

    • strcpy

    • strncpy

    • strcat

    • memset

  • Вы выполняете операцию записи на const - квалифицированный объект.

Риск

Риск зависит от модификаций, сделанных к const - квалифицированный объект.

СитуацияРиск
Передавая mkstemp, mkostemp, mkostemps, mkdtemp, и так далее.Эти функции заменяют последние шесть символов своего первого аргумента со строкой. Поэтому они ожидают модифицируемый массив char в качестве своего первого аргумента.
Передавая strcpy, strncpy, strcat, memset и так далее.Эти функции изменяют свой целевой аргумент. Поэтому они ожидают модифицируемый массив char в качестве своего целевого аргумента.
Запись в объектСпецификатор const подразумевает соглашение, что значение объекта не будет изменено. Путем записи в const - квалифицированный объект, вы расторгаете соглашение. Результат операции не определен.

Фиксация

Фиксация зависит от модификации, сделанной к const - квалифицированный объект.

СитуацияФиксация
Передавая mkstemp, mkostemp, mkostemps, mkdtemp, и так далее.Передайте объект non-const в качестве первого аргумента функции.
Передавая strcpy, strncpy, strcat, 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