MISRA C:2012 Rule 7.4

Строковый литерал не должен быть присвоен объекту, если тип объекта не будет “указателем на квалифицированный к const char”

Описание

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

Строковый литерал не должен быть присвоен объекту, если тип объекта не будет “указателем на квалифицированный к const char”.

Объяснение

Это правило предотвращает присвоения, которые позволяют модификацию строкового литерала.

Попытка изменить строковый литерал может привести к неопределенному поведению. Например, некоторые реализации могут сохранить строковые литералы в постоянной памяти. Попытка изменить строковый литерал может привести к исключению или катастрофическому отказу.

Реализация Polyspace

Средство проверки правила отмечает присвоение строковых литералов к:

  • Указатели с типом данных кроме const char*.

  • Массивы с типом данных кроме const char.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

char *str1 = "xxxxxx";            /* Non-Compliant */
const char *str2 = "xxxxxx";      /* Compliant */

void checkSystem1(char*);
void checkSystem2(const char*);

void main() {
 checkSystem1("xxxxxx");    /* Non-Compliant */
 checkSystem2("xxxxxx");    /* Compliant */
}

В этом примере не нарушено правило, когда строковые литералы присвоены const char* указатели, или непосредственно или через копию аргументов функции. Правило нарушено только когда const спецификатор не используется.

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

Группа: литералы и константы
Категория: необходимый
Категория AGC: необходимый

Введенный в R2014b