exponenta event banner

Запись в объект const qualified

Объект, объявленный с помощью 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и так далее.Передать не -const объект в качестве первого аргумента функции.
Переход к strcpy, strncpy, strcat, memset и так далее.Передать не -const объект в качестве целевого аргумента функции.
Запись в объектВыполнение операции записи на не-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 Объект

Одной из возможных корректировок является назначение строки константы не -const объект и использовать не -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
Воздействие: Высокое
CWE ID: 227, 471, 686
Представлен в R2015b