ISO/IEC TS 17961 [strmod]

Изменение строковых литералов

Описание

Управляйте определением

Изменение строковых литералов. [1]

Реализация Polyspace

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

Примеры

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

Проблема

Запись в 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);
}

Проверяйте информацию

Разрешимость: неразрешимый

Введенный в R2019a


[1]  Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.