exponenta event banner

CERT C: STR30-C правил

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

Описание

Определение правила

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

Внедрение Polyspace

Эта проверка проверяет наличие объекта Writing to 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 объект.

См. примеры исправлений ниже.

Если вы не хотите устранять проблему, добавьте комментарии к результату или коду, чтобы избежать другой проверки. См. раздел Результаты анализа пространства адресов с помощью исправлений ошибок или обоснований.

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

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

Группа: Правило 07. Символы и строки (STR)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.