AUTOSAR C++14 Rule A2-13-4

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

Описание

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

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

Объяснение

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

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

Более поздние стандарты C++ требуют предупреждения компилятора для таких модификаций. Правило действует для ситуаций, когда вы подавляете предупреждения компилятора (и правила AUTOSAR C++ 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