exponenta event banner

Правило AUTOSAR C++ 14 A2-13-4

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

Описание

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

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

Объяснение

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

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

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

Внедрение Polyspace

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

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

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

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