exponenta event banner

CERT C++: DCL52-CPP

Никогда не определяйте тип ссылки с const или летучим

Описание

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

Никогда не определяйте тип ссылки как const или volatile.[1]

Реализация Polyspace

Эта проверка проверяет на наличие следующих проблем:

  • Тип ссылки C++, квалифицированный как const или летучий.

  • C++ ссылка на сертифицированный тип с последующей модификацией.

Примеры

расширить все

Проблема

const-Qualified Reference Type происходит, когда переменная с ссылкой объявлена как const или volatile квалификатор, для образца:

char &const c;

Риск

Стандарт C++ 14 утверждает, что const или volatile квалифицированные ссылки плохо сформированы (если они не введены через typedef, в этом случае они игнорируются). Например, ссылка на одну переменную не может быть сделана, чтобы ссылаться на другую переменную. Поэтому использование const квалификатор не требуется для переменной со ссылочным типом.

Часто использование этих квалификаторов указывает на ошибку кодирования. Например, вы хотели объявить ссылку на const-квалифицированный тип:

char const &c;
но вместо этого объявил const-квалифицированная ссылка:
char &const c;
Если ваш компилятор не обнаруживает ошибку, можно увидеть неожиданные результаты. Например, вы можете ожидать c быть неизменяемым, но видеть другое значение c по сравнению с ее значением при объявлении.

Зафиксировать

Посмотрите, const ли или volatile неверно размещен квалификатор. Например, посмотрите, хотите ли вы обратиться к const-квалифицированный тип и введенный:

char &const c;
вместо:
char const &c;
Если квалификатор размещен неправильно, исправьте ошибку. Поместите const или volatileквалификатор перед & оператор. В противном случае удалите избыточный квалификатор.

Пример - const-Квалифицированный тип ссылки
int func (int &const iRef) {
    iRef++;
    return iRef%2;
}

В этом примере iRef является const-квалифицированный тип ссылки. Начиная с iRef не может ссылаться на другую переменную, const классификатор избыточен.

Коррекция - Удаление const Определитель

Удалите избыточную const квалификатор. Начиная с iRef изменяется в func, он не предназначен для ссылки на const-квалифицированная переменная. Перемещение const квалификатор перед & приведет к ошибке компиляции.

int func (int &iRef) {
    iRef++;
    return iRef%2;
}
Коррекция - Фиксирование размещения const Определитель

Если вы не идентифицируете, чтобы изменить iRef в func, объявить iRef как ссылка на const-квалифицированная переменная. Поместите const квалификатор перед & оператор. Убедитесь, что вы не измените iRef в func.

int func (int const &iRef) {
    return (iRef+1)%2;
}
Проблема

Этот дефект возникает, когда переменная, которая ссылается на const-qualified type изменяется после объявления.

Например, в этом примере refVal имеет тип const int &, но его значение изменяется в последующем операторе.

using constIntRefType = const int &;
void func(constIntRefType refVal, int val){
   ...
   refVal = val; //refVal is modified
   ...
}

Риск

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

Компиляторы могут обнаруживать изменение ссылок на const-квалифицированные типы как ошибка компиляции. Если компилятор не обнаруживает ошибку, поведение не определено. Polyspace® помечает этот дефект независимо от ошибки компиляции.

Зафиксировать

Избегайте изменения const-квалифицированные типы ссылок. Если изменение требуется, удалите const квалификатор из объявления ссылочного типа.

Пример - Изменение const-квалифицированные типы ссылок
typedef const int cint;           
typedef cint& ref_to_cint;       

void func(ref_to_cint refVal, int initVal){
   refVal = initVal;
}

В этом примере ref_to_cint является ссылкой на const-квалифицированный тип. Переменная refVal типа ref_to_cint должно быть инициализировано при func вызывается и не изменяется впоследствии. Изменение нарушает договор, подразумеваемый const квалификатор.

Коррекция - Избегайте изменения const-квалифицированные типы ссылок

Одна из возможных коррекций - избежать const в объявлении типа ссылки.

typedef int& ref_to_int;       

void func(ref_to_int refVal, int initVal){
   refVal = initVal;
}

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

Группа: 01. Объявления и инициализация (DCL)
Введенный в R2019a

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОН И/ИЛИ ЕГО ИНЖЕНЕРНОГО ИНСТИТУТА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ НА БАЗИСЕ «КАК ЕСТЬ». УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБОГО ВОПРОСА, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЮ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ КОММЕРЧЕСКОЙ ВЫГОДЫ, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Это программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллон или его Институтом программной инженерии.