exponenta event banner

MISRA C++: Правило 2008 0-1-4

Проект не должен содержать энергонезависимые переменные POD, имеющие только одно использование

Описание

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

Проект не должен содержать энергонезависимых переменных POD, имеющих только одно использование.

Объяснение

При использовании энергонезависимой переменной с типом «Простые старые данные» (int, doubleи т. д.) только один раз, переменную можно заменить постоянным литералом. Использование переменной указывает на то, что вы намеревались использовать эту переменную несколько раз и что в коде может быть ошибка программирования. Другие виды использования энергонезависимой переменной могут быть опущены или неправильно использованы другие переменные в предполагаемых точках использования.

Внедрение Polyspace

Средство проверки помечает локальные и статические переменные, имеющие область функций (локально статическую) и область файлов, которые используются только один раз. Проверка рассматривает const- квалифицированные глобальные переменные без extern спецификатор как статические переменные с областью файла.

Средство проверки считает эти случаи использования как одно использование энергонезависимой переменной:

  • Явная инициализация с использованием постоянного литерала или возвращаемого значения функции

  • Назначение

  • Ссылка на переменную, такую как операция чтения

  • Назначение адреса переменной указателю

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

Некоторые объекты предназначены для использования их семантикой только один раз. Polyspace ® не помечает ни одного использования этих объектов:

  • lock_guard

  • scoped_lock

  • shared_lock

  • unique_lock

  • thread

  • future

  • shared_future

Если используются нестандартные объекты, которые обеспечивают те же функциональные возможности, что и объекты из предыдущего списка, Polyspace может пометить одиночное использование нестандартных объектов. Оправдать их одиночное использование с помощью комментариев.

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

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

Примеры

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

#include <mutex>
int readStatus1();
int readStatus2();
extern std::mutex m;
void foo()
{
    // Initiating lock 'lk'
    std::lock_guard<std::mutex> lk{m};   
    int checkEngineStatus1 = readStatus1();
    int checkEngineStatus2 = readStatus2();//Noncompliant

    if(checkEngineStatus1) {
        //Perform some actions if both statuses are valid   
    }
    // Release lock when 'lk' is deleted at exit point of scope
}

В этом примере переменная checkEngineStatus2 используется только один раз. Однократное использование этой переменной может указывать на ошибку программирования. Например, возможно, вы намеревались проверить оба checkEngineStatus1 и checkEngineStatus2 в if условие, но пропущена вторая проверка. lock_guard объект lk также используется только один раз. Потому что семантика lock_guard объект оправдывает его однократное использование, Polyspace не помечает его.

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

Группа: Вопросы, не зависящие от языка
Категория: Обязательно
Представлен в R2020b