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