AUTOSAR C++14 Rule A2-13-4

Строковые литералы не должны быть присвоены непостоянным указателям

Описание

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

Строковые литералы не должны быть присвоены непостоянным указателям.

Объяснение

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

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

Более поздние стандарты C++ требуют предупреждения компилятора для таких модификаций. Правило существует для ситуаций, когда вы подавляете предупреждения компилятора (и C++ AUTOSAR 14 правил, сопоставленных с теми предупреждениями).

Реализация Polyspace

Средство проверки правила отмечает присвоение строковых литералов к указателям кроме указателей на const объекты.

Средство проверки не отмечает присвоение строковых литералов к non-const массивы. Средство проверки для AUTOSAR C++ 14 Rule A18-1-1 запрещает прямое использование массивов C-стиля и предотвращает эти присвоения.

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

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

Примеры

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

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 спецификатор не используется.

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

Группа: Выражения

Введенный в R2019a