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, strncpy, strcat, memset и так далее.Эти функции изменяют свой целевой аргумент. Поэтому они ожидают модифицируемый массив char в качестве своего целевого аргумента.
Запись в объектСпецификатор const подразумевает соглашение, что значение объекта не будет изменено. Путем записи в const - квалифицированный объект, вы расторгаете соглашение. Результат операции не определен.

Фиксация

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

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

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

Группа: правило 07. Символы и строки (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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ВЫРАЗИЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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