CERT C++: STR30-C

Не пытайтесь изменить строковые литералы

Описание

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

Не пытайтесь изменить строковые литералы. [1]

Примеры

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

Описание

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

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

Группа: 05. Символы и строки (STR)

Введенный в R2019a


[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ-МЕЛЛОН И/ИЛИ ЕГО ИНСТИТУТА ПРОГРАММНОЙ ИНЖЕНЕРИИ СОДЕРЖАЛ, ЗДЕСЬ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ "ASIS". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.